Kaip rūšiuoti daugiamatę masyvą pagal vertę?

Kaip galiu rūšiuoti šį masyvą pagal „užsakymo“ raktą? Nors vertybės šiuo metu yra nuoseklios, jos ne visada bus.

 Array ( [0] => Array ( [hashtag] => a7e87329b5eab8578f4f1098a152d6f4 [title] => Flower [order] => 3 ) [1] => Array ( [hashtag] => b24ce0cd392a5b0b8dedc66c25213594 [title] => Free [order] => 2 ) [2] => Array ( [hashtag] => e7d31fc0602fb2ede144d18cdffd816b [title] => Ready [order] => 1 ) ) 
934
23 апр. nustatyta stef balandžio 23 d 2010-04-23 16:54 '10, 16:54, 2010-04-23 16:54
@ 9 atsakymai

Pabandykite naudoti . Jei vis dar naudojate PHP 5.2 ar anksčiau, pirmiausia turite apibrėžti rūšiavimo funkciją:

 function sortByOrder($a, $b) { return $a['order'] - $b['order']; } usort($myArray, 'sortByOrder'); 

Pradedant nuo 5.3 PHP, galite naudoti anoniminę funkciją:

 usort($myArray, function($a, $b) { return $a['order'] - $b['order']; }); 

Galiausiai, naudojant PHP 7, galite naudoti kosminio laivo operatorių :

 usort($myArray, function($a, $b) { return $a['order'] <=> $b['order']; }); 

Norėdami tai išplėsti į daugiamatį rūšiavimą, žr. Antrąjį / trečiąjį rūšiavimo elementus, jei pirmasis yra nulis, tai geriausia paaiškinti toliau. Taip pat galite naudoti, jei norite rūšiuoti pagal subtemus.

 usort($myArray, function($a, $b) { $retval = $a['order'] <=> $b['order']; if ($retval == 0) { $retval = $a['suborder'] <=> $b['suborder']; if ($retval == 0) { $retval = $a['details']['subsuborder'] <=> $b['details']['subsuborder']; } } return $retval; }); 

Jei reikia palaikyti pagrindines asociacijas, naudokite uasort() - žr. uasort() masyvo rūšiavimo funkcijų palyginimas .

1448
23 апр. Atsakymą pateikė Christian Studer balandžio 23 d 2010-04-23 17:04 '10, 5:04 PM 2010-04-23 17:04
 function aasort ( $key) { $sorter=array(); $ret=array(); reset($array); foreach ($array as $ii => $va) { $sorter[$ii]=$va[$key]; } asort($sorter); foreach ($sorter as $ii => $va) { $ret[$ii]=$array[$ii]; } $array=$ret; } aasort($your_array,"order"); 
269
Atsakymas pateikiamas o0 '. 23 bal 2010-04-23 16:57 '10, 16:57, 2010-04-23 16:57

Naudoju šią funkciją:

 function array_sort_by_column( $col, $dir = SORT_ASC) { $sort_col = array(); foreach ($arr as $key=> $row) { $sort_col[$key] = $row[$col]; } array_multisort($sort_col, $dir, $arr); } array_sort_by_column($array, 'order'); 
250
23 апр. Atsakė Tom Haigh balandžio 23 d 2010-04-23 17:03 '10, 17:03, 2010-04-23 17:03

Paprastai naudoju usort ir perduodu savo palyginimo funkciją. Šiuo atveju tai labai paprasta:

 function compareOrder($a, $b) { return $a['order'] - $b['order']; } usort($array, 'compareOrder'); 
65
23 апр. atsakymas duotas Janui Fabriui 2010-04-23 17:04 '10, 5:04 PM 2010-04-23 17:04
 $sort = array(); $array_lowercase = array_map('strtolower', $array_to_be_sorted); array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $alphabetically_ordered_array); 

Tai taikoma ir didžiosioms, ir mažosioms raidėms.

14
22 февр. atsakymas pateikiamas Nitrodbz 22 vasario mėn 2012-02-22 23:59 '12 12:59 pm 2012-02-22 23:59

Vienas iš būdų tai pasiekti

  $new = [ [ 'hashtag' => 'a7e87329b5eab8578f4f1098a152d6f4', 'title' => 'Flower', 'order' => 3, ], [ 'hashtag' => 'b24ce0cd392a5b0b8dedc66c25213594', 'title' => 'Free', 'order' => 2, ], [ 'hashtag' => 'e7d31fc0602fb2ede144d18cdffd816b', 'title' => 'Ready', 'order' => 1, ], ]; $keys = array_column($new, 'order'); $result = array_multisort($keys, SORT_ASC, $new); 

Rezultatas:

  Array ( [0] => Array ( [hashtag] => e7d31fc0602fb2ede144d18cdffd816b [title] => Ready [order] => 1 ) [1] => Array ( [hashtag] => b24ce0cd392a5b0b8dedc66c25213594 [title] => Free [order] => 2 ) [2] => Array ( [hashtag] => a7e87329b5eab8578f4f1098a152d6f4 [title] => Flower [order] => 3 ) ) 
7
04 июля '18 в 16:30 2018-07-04 16:30 atsakymas pateikiamas ajuchacko91 liepos 4 d., 18 val

Jei norite rūšiuoti masyvą pagal pagrindinę vertę "pavadinimas", naudokite:

 uasort($myArray, function($a, $b) { return strcmp($a['title'], $b['title']); }); 

strcmp lygina stygas.

uasort () palaiko masyvo raktus, kaip jie yra apibrėžti.

6
13 марта '18 в 13:35 2018-03-13 13:35 atsakymą BK pateikė kovo 13 d. 18 val. 15:35 2018-03-13 13:35

Labiausiai lankstus metodas yra naudoti šį metodą.

 Arr::sortByKeys(array $array, $keys, bool $assoc = true): array 

kodėl:

  • Galite rūšiuoti pagal bet kurį raktą (taip pat įdėtą kaip 'key1.key2.key3' arba ['k1', 'k2', 'k3'] )

  • Veikia tiek asociatyviosiose, tiek ne asociatyviose matricose ( $assoc flag)

  • Ji nenaudoja nuorodos - grąžina naują rūšiuojamą masyvą.

Jūsų atveju tai bus taip paprasta:

 $sortedArray = Arr::sortByKeys($array, 'order'); 

Šis metodas yra šios bibliotekos dalis .

1
06 сент. atsakymas įteiktas Minwork 06 sept. 2018-09-06 21:10 '18, 9:10 pm 2018-09-06 21:10

Let's face it: php neturi paprasto >

Ši procedūra yra intuityvi, o tai reiškia greitesnį derinimą ir priežiūrą:

 // automatic population of array $tempArray = array(); $annotations = array(); // ... some code // SQL $sql retrieves result array $result // $row[0] is the ID, but is populated out of order (comes from // multiple selects populating various dimensions for the same DATE // for example while($row = mysql_fetch_array($result)) { $needle = $row[0]; arrayIndexes($needle); // create a parallel array with IDs only $annotations[$needle]['someDimension'] = $row[1]; // whatever } asort($tempArray); foreach ($tempArray as $arrayKey) { $dataInOrder = $annotations[$arrayKey]['someDimension']; // .... more code } function arrayIndexes ($needle) { global $tempArray; if (!in_array($needle,$tempArray)) { array_push($tempArray,$needle); } } 
0
03 апр. atsakymą pateikė tony gil 03 balandžio. 2018-04-03 14:36 '18, 14:36 pm 2018-04-03 14:36

Kiti klausimai apie žymių arba Ask a Question