วิธีการเรียงลำดับของอาร์เรย์ที่เชื่อมโยงโดยค่าของคีย์ที่กำหนดใน PHP?


446

รับอาร์เรย์นี้:

$inventory = array(

   array("type"=>"fruit", "price"=>3.50),
   array("type"=>"milk", "price"=>2.90),
   array("type"=>"pork", "price"=>5.43),

);

ฉันต้องการเรียงลำดับ$inventoryองค์ประกอบตามราคาเพื่อรับ:

$inventory = array(

   array("type"=>"pork", "price"=>5.43),
   array("type"=>"fruit", "price"=>3.50),
   array("type"=>"milk", "price"=>2.90),

);

ฉันจะทำสิ่งนี้ได้อย่างไร


คำตอบ:


606

คุณกำลังขวา, array_multisort()ฟังก์ชั่นที่คุณกำลังมองหาอยู่

นี่คือตัวอย่างที่นำมาจากคู่มือโดยตรงและปรับให้เข้ากับกรณีของคุณ:

$price = array();
foreach ($inventory as $key => $row)
{
    $price[$key] = $row['price'];
}
array_multisort($price, SORT_DESC, $inventory);

ในฐานะของ PHP 5.5.0 คุณสามารถใช้ array_column () แทน foreach นั้น

$price = array_column($inventory, 'price');

array_multisort($price, SORT_DESC, $inventory);

5
แม้ว่าจะมีราคาแพงกว่าทางเลือก
แมตต์

5
แพงมาก? ที่แปลกในเครื่องของฉัน (ใช้ PHP 5.3.1-dev) array_multisort () เป็นกี่เปอร์เซ็นต์ได้เร็วขึ้นในอาร์เรย์ขนาดเล็กและถึง 100 เท่าได้เร็วขึ้นในอาร์เรย์ขนาดใหญ่ (100 + องค์ประกอบ)
จอชเดวิส

3
ไม่ควรต้องการการเปลี่ยนแปลงใด ๆ ในการทำงานกับปุ่มตัวเลข หากคุณพบข้อผิดพลาดหรือพฤติกรรมแปลก ๆ ที่เกี่ยวข้องกับปุ่มตัวเลขให้โพสต์เป็นคำถามใหม่
Josh Davis

4
array_multisort มีปัญหาใหญ่: มันไม่รักษารหัสเดิม
machineaddict

1
@machineaddict มันจะรักษากุญแจเชื่อมโยง
Matej Svajger

318

PHP 7+

ในฐานะของ PHP 7 สิ่งนี้สามารถทำได้อย่างกระชับโดยใช้usortกับฟังก์ชั่นนิรนามที่ใช้ตัวดำเนินการยานอวกาศเพื่อเปรียบเทียบองค์ประกอบ

คุณสามารถเรียงลำดับจากน้อยไปมากเช่นนี้:

usort($inventory, function ($item1, $item2) {
    return $item1['price'] <=> $item2['price'];
});

หรือเรียงจากมากไปน้อยเช่นนี้:

usort($inventory, function ($item1, $item2) {
    return $item2['price'] <=> $item1['price'];
});

เพื่อให้เข้าใจถึงวิธีการทำงานโปรดทราบว่าusortใช้ฟังก์ชั่นการเปรียบเทียบที่ผู้ใช้ให้ซึ่งต้องปฏิบัติดังนี้ (จากเอกสาร):

ฟังก์ชั่นการเปรียบเทียบจะต้องคืนค่าจำนวนเต็มน้อยกว่าเท่ากับหรือมากกว่าศูนย์หากอาร์กิวเมนต์แรกถูกพิจารณาว่ามีค่าน้อยกว่าเท่ากับเท่ากับหรือมากกว่าวินาที

และทราบด้วยว่า<=>ผู้ประกอบการยานอวกาศ

ส่งกลับค่า 0 ถ้าตัวถูกดำเนินการทั้งสองเท่ากัน 1 ถ้าด้านซ้ายมีค่ามากกว่าและ -1 ถ้าด้านขวามีค่ามากกว่า

ซึ่งเป็นสิ่งที่usortต้องการ ในความเป็นจริงเกือบทุกเหตุผลที่ให้ไว้สำหรับการเพิ่ม<=>ภาษาในhttps://wiki.php.net/rfc/combined-comparison-operatorก็คือ

ทำให้การเขียนคำสั่งโทรกลับสำหรับการใช้งานusort()ง่ายขึ้น


PHP 5.3 ขึ้นไป

PHP 5.3 แนะนำฟังก์ชั่นที่ไม่ระบุชื่อ แต่ยังไม่มีโอเปอเรเตอร์ยานอวกาศ เรายังคงสามารถใช้usortเรียงลำดับอาร์เรย์ของเราได้ แต่มันค่อนข้างละเอียดและเข้าใจยากกว่า:

usort($inventory, function ($item1, $item2) {
    if ($item1['price'] == $item2['price']) return 0;
    return $item1['price'] < $item2['price'] ? -1 : 1;
});

โปรดทราบว่าแม้ว่าจะเป็นเรื่องปกติสำหรับผู้เปรียบเทียบที่เกี่ยวข้องกับค่าจำนวนเต็มเพียงแค่คืนความแตกต่างของค่าเช่น$item2['price'] - $item1['price']เราไม่สามารถทำเช่นนั้นได้อย่างปลอดภัยในกรณีนี้ นี่เป็นเพราะราคาเป็นตัวเลขจุดลอยตัวในตัวอย่างของผู้ถามคำถาม แต่ฟังก์ชั่นการเปรียบเทียบที่เราส่งให้usortต้องส่งคืนจำนวนเต็มเพื่อusortให้ทำงานอย่างถูกต้อง:

การส่งคืนค่าที่ไม่ใช่จำนวนเต็มจากฟังก์ชั่นการเปรียบเทียบเช่น float จะส่งผลให้การส่งข้อมูลภายในเป็นจำนวนเต็มของค่าส่งคืนของการเรียกกลับ ดังนั้นค่าเช่น 0.99 และ 0.1 ทั้งคู่จะถูกแปลงเป็นค่าจำนวนเต็ม 0 ซึ่งจะเปรียบเทียบค่าดังกล่าวเท่ากัน

นี่เป็นกับดักสำคัญที่ต้องคำนึงถึงเมื่อใช้usortใน PHP 5.x! คำตอบดั้งเดิมของฉันเวอร์ชันนี้ทำผิดพลาด แต่ฉันก็มีผู้ติดตามมากถึงสิบคนจากการดูมากกว่าพันครั้งโดยที่ไม่มีใครสังเกตเห็นข้อผิดพลาดร้ายแรง ความง่ายในการขาดสิ่งที่ฉันสามารถทำให้ฟังก์ชั่นเปรียบเทียบได้อย่างแม่นยำคือเหตุผลที่ผู้ประกอบการยานอวกาศที่ใช้งานง่ายถูกเพิ่มเข้าในภาษาใน PHP 7


8
ขออภัยวิธีการนี้จะลบคีย์สตริงออกจากอาร์เรย์ที่เชื่อมโยง ควรใช้ฟังก์ชัน "uasort" แทน
Matteo-SoftNet

8
@DotMat ที่น่าสนใจ - uasortผมไม่ทราบเกี่ยวกับ อย่างไรก็ตามหลังจากดูเอกสารแล้วคำตอบนี้ยังคงถูกต้องในกรณีนี้ ในตัวอย่างของ OP อาร์เรย์ที่จะเรียงมีดัชนีตัวเลขเรียงตามลำดับมากกว่าดัชนีสตริงจึงusortเหมาะสมกว่า การใช้อาเรย์uasortแบบเรียงลำดับตามดัชนีจะส่งผลให้มีอาเรย์เรียงลำดับซึ่งไม่ได้เรียงลำดับโดยดัชนีตัวเลขเช่นองค์ประกอบแรกที่เห็นในforeachลูปไม่ใช่$your_array[0]สิ่งที่ไม่น่าจะเป็นพฤติกรรมที่พึงประสงค์
Mark Amery

100

ในขณะที่คนอื่นแนะนำการใช้อย่างถูกต้องarray_multisort()ด้วยเหตุผลบางอย่างดูเหมือนว่าไม่มีคำตอบที่จะยอมรับการมีอยู่ของarray_column()ซึ่งสามารถทำให้การแก้ปัญหาง่ายขึ้นอย่างมาก ดังนั้นข้อเสนอแนะของฉันจะเป็น:

array_multisort(array_column($inventory, 'price'), SORT_DESC, $inventory);

1
ด้วยเหตุผลบางอย่างฉันไม่สามารถทำงานกับสายอักขระที่มีตัวอักษรพิมพ์เล็ก / ใหญ่ได้ แม้แต่การใช้ SORT_FLAG_CASE การทำงานต่อไปนี้สำหรับการเปรียบเทียบสตริงสำหรับฉัน: array_multisort (array_map (strtolower, array_column ($ ipr_projects, 'ชื่อ')), SORT_ASC, $ ipr_projects);
Pabamato

8
นี่คือคำตอบที่หรูหราที่สุด ควรได้คะแนนสูงกว่ามาก!
Armin Hierstetter

3
สั้นและง่ายที่สุดยอมรับหนึ่งในความคิดของฉัน
StudioX

1
สิ่งที่ดีที่นี่ ทำงานอย่างสมบูรณ์แบบสำหรับฉัน!
ขี้ขลาดหมอ

ทำงานอย่างมีเสน่ห์, ty
Leif_Lundberg

42

เนื่องจากองค์ประกอบอาร์เรย์ของคุณเป็นอาร์เรย์ตัวเองด้วยคีย์สตริงทางออกที่ดีที่สุดของคุณคือการกำหนดฟังก์ชั่นการเปรียบเทียบที่กำหนดเอง มันค่อนข้างรวดเร็วและง่ายต่อการทำ ลองสิ่งนี้:

function invenDescSort($item1,$item2)
{
    if ($item1['price'] == $item2['price']) return 0;
    return ($item1['price'] < $item2['price']) ? 1 : -1;
}
usort($inventory,'invenDescSort');
print_r($inventory);

สร้างสิ่งต่อไปนี้:

Array
(
    [0] => Array
        (
            [type] => pork
            [price] => 5.43
        )

    [1] => Array
        (
            [type] => fruit
            [price] => 3.5
        )

    [2] => Array
        (
            [type] => milk
            [price] => 2.9
        )

)

4
เมื่อรวมกับความคิดเห็นอื่น ๆ ที่นี่ (ฟังก์ชัน uasort และ inline anonymous) คุณจะได้รับหนึ่งซับ:uasort( $inventory, function ($a, $b) { if ( $a==$b ) return 0; else return ($a > $b) ? -1 : 1; });
Alan Porter

@AlanPorter usortดูเหมือนจะเหมาะสมกว่าuasortการเรียงลำดับอาร์เรย์ด้วยปุ่มตัวเลขตามลำดับ การลงท้ายด้วยอาร์เรย์ที่องค์ประกอบแรกอยู่ที่ดัชนี1และองค์ประกอบที่สองคือดัชนี0คือพฤติกรรมแปลก ๆ และกับดักแน่นอนสำหรับผู้ที่ไม่คุ้นเคยกับรายละเอียดของอาร์เรย์ของ PHP usortให้ผลลัพธ์ที่คุณคาดหวัง
Mark Amery

25

ฉันสิ้นสุดที่:

function sort_array_of_array(&$array, $subfield)
{
    $sortarray = array();
    foreach ($array as $key => $row)
    {
        $sortarray[$key] = $row[$subfield];
    }

    array_multisort($sortarray, SORT_ASC, $array);
}

เพียงเรียกใช้ฟังก์ชันส่งผ่านอาร์เรย์และชื่อของเขตข้อมูลของอาร์เรย์ระดับที่สอง ชอบ:

sort_array_of_array($inventory, 'price');

1
ฮา! ฉันเพิ่งทำสิ่งเดียวกันสวยมากและจะโพสต์ แต่เห็นคุณ ... upvoted
Rob Evans

1
Downvoting เพราะนี่เป็นโซลูชั่นเดียวกับที่ Josh Davis โพสต์เมื่อหลายปีก่อน
Mark Amery

ไม่เห็นด้วย ... ฉันไม่ได้บอกว่ามันเป็นทางออกที่แตกต่างฉันแค่บอกว่าฉันจบลงด้วยการแก้ปัญหานี้และให้ฟังก์ชั่นการทำงานเต็มรูปแบบ
Danielzt

1
@ MarkAmery ฉันชอบคำตอบที่มีอยู่ในฟังก์ชั่น มันสนับสนุนให้คัดลอก paster ใช้ฟังก์ชั่นและหวังว่าจะเขียนโค้ดสปาเก็ตตี้ให้น้อยลง
Goose

19

คุณสามารถใช้usortกับฟังก์ชั่นที่ไม่ระบุชื่อเช่น

usort($inventory, function ($a, $b) { return strnatcmp($a['price'], $b['price']); });

รุ่น PHP 5> = 5.5.0, PHP 7 สำหรับคนที่ชอบฉันที่ต้องการให้มันใช้งานได้สำหรับพวกเขา ..
Matt P

1
น่าสังเกตว่าstrnatcmpมีความหมายสำหรับการเปรียบเทียบสตริงดูเหมือนว่าจะทำงานได้ดีที่นี่ เห็นได้ชัดว่า "ลำดับธรรมชาติ" มันดำเนินการรวมถึงการเรียงลำดับสตริงตัวเลขเป็นตัวเลขแทนที่จะเป็นศัพท์
Mark Amery

10
$inventory = 
    array(array("type"=>"fruit", "price"=>3.50),
          array("type"=>"milk", "price"=>2.90),
          array("type"=>"pork", "price"=>5.43),
          );

function pricesort($a, $b) {
  $a = $a['price'];
  $b = $b['price'];
  if ($a == $b)
    return 0;
  return ($a > $b) ? -1 : 1;
}

usort($inventory, "pricesort");
// uksort($inventory, "pricesort");

print("first: ".$inventory[0]['type']."\n\n");
// for usort(): prints milk (item with lowest price)
// for uksort(): prints fruit (item with key 0 in the original $inventory)

// foreach prints the same for usort and uksort.
foreach($inventory as $i){
  print($i['type'].": ".$i['price']."\n");
}

เอาท์พุท:

first: pork

pork: 5.43
fruit: 3.5
milk: 2.9

6

จากเรียงลำดับอาร์เรย์ของการเชื่อมโยงอาร์เรย์ตามค่าของคีย์ที่กำหนดใน php :

uasort ( http://php.net/uasort ) ช่วยให้คุณสามารถจัดเรียงอาร์เรย์ตามฟังก์ชันที่คุณกำหนดเอง ในกรณีของคุณมันง่าย:

$array = array(
  array('price'=>'1000.50','product'=>'test1'),
  array('price'=>'8800.50','product'=>'test2'),
  array('price'=>'200.0','product'=>'test3')
);

function cmp($a, $b) {
  return $a['price'] > $b['price'];
}

uasort($array, "cmp");

1
คำตอบนี้ปรากฏในคิวตรวจสอบคุณภาพต่ำเนื่องจากคุณไม่ได้ให้คำอธิบายใด ๆ ของรหัส หากรหัสนี้ตอบคำถามให้พิจารณาเพิ่มการเพิ่มข้อความอธิบายรหัสในคำตอบของคุณ ด้วยวิธีนี้คุณมีแนวโน้มที่จะได้รับ upvotes มากขึ้นและช่วยให้ผู้ถามเรียนรู้สิ่งใหม่
lmo

1
hmpf นี่คือคำตอบที่ดีที่สุด
commonpike

1
-1; cmpฟังก์ชั่นที่นี่เป็นสิ่งที่ผิด ก็ควรที่จะกลับมา"เป็นจำนวนเต็มน้อยกว่าเท่ากับหรือมากกว่าศูนย์ถ้าอาร์กิวเมนต์แรกถือว่าเป็นตามลำดับน้อยกว่าเท่ากับหรือมากกว่าสอง"แต่ผลตอบแทนหรือtrue falseดูเหมือนว่าน่าทึ่งสำหรับการทำงานอย่างไรก็ตาม - อาจเป็นเพราะการใช้งานในปัจจุบันของusortและเพื่อน ๆ ปฏิบัติต่อกรณี "น้อยกว่า" และ "เท่ากับ" เหมือนกัน - แต่ไม่นับรวมกับการทำงานในเวอร์ชัน PHP ในอนาคต หากพวกเขาพยายามทำให้มีเสถียรภาพ (เช่นไม่ย้ายองค์ประกอบที่เท่ากันโดยไม่จำเป็น) สิ่งนี้จะแตก
Mark Amery

นอกจากนี้usortจะมีความเหมาะสมมากกว่าuasortที่นี่เนื่องจากuasortรักษาความสัมพันธ์ระหว่างคีย์และค่าที่ทำให้เกิดความสับสนและไม่คาดคิดเมื่อ deaing กับอาร์เรย์ตัวเลขตามลำดับ ตัวอย่างเช่นดัชนี$arrayด้านบนหลังจากการโทรuasortคือ 2, 0 และ 1 ตามลำดับ ถ้าคุณไม่ต้องการด้วยเหตุผลบางอย่างคุณอาจจะรู้สึกสบายใจที่จะใช้usortซึ่งทำดัชนีอาร์เรย์ใหม่และสั่งใหม่อีกครั้ง
Mark Amery

5

ได้รับการทดสอบกับ 100,000 ระเบียน: เวลาในไม่กี่วินาที (คำนวณโดย funciton microtime) สำหรับค่าที่ไม่ซ้ำกันเท่านั้นในการเรียงลำดับตำแหน่งสำคัญ

ทางออกของฟังก์ชั่นของ @Josh Davis: เวลาที่ใช้ : 1.5768740177155

การแก้ปัญหาของเหมือง: ใช้ เวลา : 0.094044923782349

สารละลาย:

function SortByKeyValue($data, $sortKey, $sort_flags=SORT_ASC)
{
    if (empty($data) or empty($sortKey)) return $data;

    $ordered = array();
    foreach ($data as $key => $value)
        $ordered[$value[$sortKey]] = $value;

    ksort($ordered, $sort_flags);

    return array_values($ordered); *// array_values() added for identical result with multisort*
}

7
ความต้องการสำหรับคีย์การเรียงลำดับที่ไม่ซ้ำกันนั้นเป็นประเภทของตัวจัดการดีล หากคุณมีค่าการเรียงลำดับที่ไม่ซ้ำกันซึ่งสามารถเป็นคีย์ได้จะทำให้เกิดคำถาม: ทำไมไม่สร้างอาร์เรย์ด้วยคีย์เหล่านั้นเพื่อเริ่มต้นด้วย ในสถานการณ์สมมติ OP ของมันเป็นเรื่องยากที่จะจินตนาการว่าทั้งสองรายการที่มีราคาเดียวกันจะเป็นไปไม่ได้ ซึ่งในใจการใช้โซลูชันนี้จะทำให้รายการต่างๆจากอาร์เรย์ไปอย่างลึกลับและเงียบหายไปจากชุดผลลัพธ์ที่เรียงลำดับ
Chris Baker

@Chris Baker คุณพูดถูก ใช้ได้เฉพาะกับค่าที่ไม่ซ้ำกันเท่านั้น แต่วิธีนี้ใช้งานได้เร็วมากดังนั้นความเร็วจึงเป็นเหตุผลในการผลิตและใช้งาน ในขณะนี้อาจจะไม่จริงต้องทดสอบด้วย PHP 7.1.x
Nefelim

4

ฉันใช้uasortสิ่งนี้

<?php
$users = [
    [
        'username' => 'joe',
        'age' => 11
    ],
    [
        'username' => 'rakoto',
        'age' => 21
    ],
    [
        'username' => 'rabe',
        'age' => 17
    ],
    [
        'username' => 'fy',
        'age' => 19
    ],    
];


uasort($users, function ($item, $compare) {
    return $item['username'] >= $compare['username']; 
});

var_dump($users);

3

ฟังก์ชั่นนี้สามารถใช้งานได้อีกครั้ง:

function usortarr(&$array, $key, $callback = 'strnatcasecmp') {
    uasort($array, function($a, $b) use($key, $callback) {
        return call_user_func($callback, $a[$key], $b[$key]);
    });
}

มันทำงานได้ดีกับค่าสตริงโดยค่าเริ่มต้น แต่คุณจะต้องย่อยการเรียกกลับสำหรับฟังก์ชั่นการเปรียบเทียบตัวเลขหากค่าทั้งหมดเป็นตัวเลข


คุณเรียกสิ่งนี้usortarrแต่แล้วเรียกuasortแทนusort; อาจจะสับสนเล็กน้อย สิ่งหลังคือ - ในกรณีของอาร์เรย์เรียงลำดับที่มีดัชนีเป็นตัวเลขเช่นเดียวกับที่แสดงในคำถามอาจเป็นสิ่งที่คุณต้องการ
Mark Amery

2

คุณอาจจะพยายามที่จะกำหนดฟังก์ชั่นการเปรียบเทียบของคุณเองแล้วใช้usort


ใช่. ฉันจะทำอย่างนั้นถ้าฉันหาทางออกไม่ได้ ฉันค่อนข้างมั่นใจว่ามีพารามิเตอร์แปลก ๆ ที่คุณสามารถเพิ่มลงในหนึ่งในประเภทนี้เพื่อให้บรรลุ ขอบคุณสำหรับความคิดของคุณ!
Matt

2

นี่เป็นวิธีการที่ฉันพบเมื่อนานมาแล้วและทำความสะอาดเล็กน้อย สิ่งนี้ใช้งานได้ดีและสามารถเปลี่ยนแปลงได้อย่างรวดเร็วเพื่อรับวัตถุเช่นกัน

/**
 * A method for sorting arrays by a certain key:value.
 * SortByKey is the key you wish to sort by
 * Direction can be ASC or DESC.
 *
 * @param $array
 * @param $sortByKey
 * @param $sortDirection
 * @return array
 */
private function sortArray($array, $sortByKey, $sortDirection) {

    $sortArray = array();
    $tempArray = array();

    foreach ( $array as $key => $value ) {
        $tempArray[] = strtolower( $value[ $sortByKey ] );
    }

    if($sortDirection=='ASC'){ asort($tempArray ); }
        else{ arsort($tempArray ); }

    foreach ( $tempArray as $key => $temp ){
        $sortArray[] = $array[ $key ];
    }

    return $sortArray;

}

เพื่อเปลี่ยนวิธีการเรียงลำดับวัตถุเพียงแค่เปลี่ยนบรรทัดต่อไปนี้:

$tempArray[] = strtolower( $value[ $sortByKey ] ); ถึง $tempArray[] = strtolower( $value->$sortByKey );

ในการเรียกใช้เมธอดก็ทำได้

sortArray($inventory,'price','ASC');


วิธีการนี้ใช้งานได้ แต่ค่อนข้างกระชับน้อยกว่าคำตอบของ Josh Davis (กับarray_multisort) หรือ Mine (กับusort) และดูเหมือนว่าจะไม่ได้เปรียบอะไรจากการแลกเปลี่ยน
Mark Amery

1
//Just in one line custom function
function cmp($a, $b)
{
return (float) $a['price'] < (float)$b['price'];
}
@uasort($inventory, "cmp");
print_r($inventory);

//result

Array
(
[2] => Array
    (
        [type] => pork
        [price] => 5.43
    )

[0] => Array
    (
        [type] => fruit
        [price] => 3.5
    )

[1] => Array
    (
        [type] => milk
        [price] => 2.9
    )

)

1

ลองนี้:

$prices = array_column($inventory, 'price');
array_multisort($prices, SORT_DESC, $inventory);
print_r($inventory);

สวัสดีและยินดีต้อนรับสู่ stackoverflow และขอบคุณสำหรับการตอบรับ ในขณะที่รหัสนี้อาจตอบคำถามคุณสามารถลองเพิ่มคำอธิบายสำหรับปัญหาที่คุณแก้ไขและวิธีที่คุณแก้ไขได้ไหม สิ่งนี้จะช่วยให้ผู้อ่านในอนาคตเข้าใจคำตอบของคุณดีขึ้นและเรียนรู้จากมัน
พลูเทีย

0

ฟังก์ชั่นแบบไดนามิกที่สมบูรณ์ ผมกระโดดขึ้นที่นี่สำหรับอาเรย์การเรียงลำดับและพบว่าฟังก์ชั่นที่น่าตื่นตาตื่นใจนี้บนhttp://php.net/manual/en/function.sort.php ฟังก์ชั่นนี้เป็นแบบไดนามิกมากที่เรียงลำดับจากน้อยไปมากและจากมากไปน้อยด้วยคีย์ที่ระบุ

ฟังก์ชั่นง่าย ๆ ในการจัดเรียงอาร์เรย์โดยใช้คีย์เฉพาะ รักษาความสัมพันธ์ของดัชนี

<?php

function array_sort($array, $on, $order=SORT_ASC)
{
    $new_array = array();
    $sortable_array = array();

    if (count($array) > 0) {
        foreach ($array as $k => $v) {
            if (is_array($v)) {
                foreach ($v as $k2 => $v2) {
                    if ($k2 == $on) {
                        $sortable_array[$k] = $v2;
                    }
                }
            } else {
                $sortable_array[$k] = $v;
            }
        }

        switch ($order) {
            case SORT_ASC:
                asort($sortable_array);
            break;
            case SORT_DESC:
                arsort($sortable_array);
            break;
        }

        foreach ($sortable_array as $k => $v) {
            $new_array[$k] = $array[$k];
        }
    }

    return $new_array;
}

$people = array(
    12345 => array(
        'id' => 12345,
        'first_name' => 'Joe',
        'surname' => 'Bloggs',
        'age' => 23,
        'sex' => 'm'
    ),
    12346 => array(
        'id' => 12346,
        'first_name' => 'Adam',
        'surname' => 'Smith',
        'age' => 18,
        'sex' => 'm'
    ),
    12347 => array(
        'id' => 12347,
        'first_name' => 'Amy',
        'surname' => 'Jones',
        'age' => 21,
        'sex' => 'f'
    )
);

print_r(array_sort($people, 'age', SORT_DESC)); // Sort by oldest first
print_r(array_sort($people, 'surname', SORT_ASC)); // Sort by surname

-1
$arr1 = array(

    array('id'=>1,'name'=>'aA','cat'=>'cc'),
    array('id'=>2,'name'=>'aa','cat'=>'dd'),
    array('id'=>3,'name'=>'bb','cat'=>'cc'),
    array('id'=>4,'name'=>'bb','cat'=>'dd')
);

$result1 = array_msort($arr1, array('name'=>SORT_DESC);

$result2 = array_msort($arr1, array('cat'=>SORT_ASC);

$result3 = array_msort($arr1, array('name'=>SORT_DESC, 'cat'=>SORT_ASC));


function array_msort($array, $cols)
{
    $colarr = array();
    foreach ($cols as $col => $order) {
    $colarr[$col] = array();
    foreach ($array as $k => $row) { $colarr[$col]['_'.$k] = strtolower($row[$col]); }
}

$eval = 'array_multisort(';

foreach ($cols as $col => $order) {
    $eval .= '$colarr[\''.$col.'\'],'.$order.',';
}

$eval = substr($eval,0,-1).');';
eval($eval);
$ret = array();
foreach ($colarr as $col => $arr) {
    foreach ($arr as $k => $v) {
        $k = substr($k,1);
        if (!isset($ret[$k])) $ret[$k] = $array[$k];
        $ret[$k][$col] = $array[$k][$col];
    }
}
return $ret;


} 

ในขณะที่ข้อมูลโค้ดนี้อาจแก้ไขคำถามรวมถึงคำอธิบายช่วยปรับปรุงคุณภาพของโพสต์ของคุณ จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและคนเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำรหัสของคุณ โปรดอย่าพยายามทำให้รหัสของคุณแน่นเกินไปด้วยคำอธิบายที่อธิบายเนื่องจากจะช่วยลดความสามารถในการอ่านของทั้งรหัสและคำอธิบาย!
Goodbye StackExchange

-5

ลองนี้:

asort($array_to_sort, SORT_NUMERIC);

สำหรับการอ้างอิงดูนี้: http://php.net/manual/en/function.asort.php

ดูธงเรียงลำดับต่างๆได้ที่นี่: http://www.php.net/manual/en/function.sort.php


นี้จะไม่ทำงานสำหรับอาร์เรย์หลายมิติ แต่เพียงช่วยให้ฉันออกไปสำหรับปัญหาอื่นขอบคุณ :)
schellmax

4
สิ่งนี้ไม่สามารถใช้ในการเรียงลำดับรายการพจนานุกรมด้วยคีย์พจนานุกรมเฉพาะและด้วยเหตุนี้จึงไม่ตอบคำถามที่ถูกวาง
Mark Amery
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.