Я могу сортировать многомерный массив, но не поддерживая ассоциацию числовых индексов.
Как сохранить ассоциацию числовых индексов?
КОД:
$waiters[76] = array('weight' => 67, 'specialties' => 1); $waiters[14] = array('weight' => 41, 'specialties' => 2); $waiters[58] = array('weight' => 85, 'specialties' => 3); $waiters[89] = array('weight' => 98, 'specialties' => 4); $waiters[68] = array('weight' => 86, 'specialties' => 5); $waiters[31] = array('weight' => 13, 'specialties' => 6); print_r($waiters); // Obtain a list of waiters foreach ($waiters as $id => $waiter) { $weight[$id] = $waiter['weight']; $specialties[$id] = $waiter['specialties']; } // Sort the data with weight descending, specialties ascending // Add $data as the last parameter, to sort by the common key array_multisort( $weight, SORT_DESC, SORT_NUMERIC, $specialties, SORT_ASC, SORT_NUMERIC, $waiters ); print_r($waiters);
ВЫВОД:
Array ( [0] => Array ( [weight] => 98 [specialties] => 4 ) [1] => Array ( [weight] => 86 [specialties] => 5 ) [2] => Array ( [weight] => 85 [specialties] => 3 ) [3] => Array ( [weight] => 67 [specialties] => 1 ) [4] => Array ( [weight] => 41 [specialties] => 2 ) [5] => Array ( [weight] => 13 [specialties] => 6 ) )
ЖЕЛАТЕЛЬНЫЙ ВЫХОД:
Array ( [89] => Array ( [weight] => 98 [specialties] => 4 ) [68] => Array ( [weight] => 86 [specialties] => 5 ) [58] => Array ( [weight] => 85 [specialties] => 3 ) [76] => Array ( [weight] => 67 [specialties] => 1 ) [14] => Array ( [weight] => 41 [specialties] => 2 ) [31] => Array ( [weight] => 13 [specialties] => 6 ) )
$keys = array_keys($waiters); array_multisort( $weight, SORT_DESC, SORT_NUMERIC, $specialties, SORT_ASC, SORT_NUMERIC, $waiters, $keys ); $waiters = array_combine($keys, $waiters);
или использовать uasort
uasort( $data, function ($some_data, $another_data) { $result = 0; if ($some_data['weight'] > $another_data['weight']) { $result = -1; } elseif ($some_data['weight'] < $another_data['weight']) { $result = 1; } elseif ($some_data['specialties'] > $another_data['specialties']) { $result = 2; } elseif ($some_data['specialties'] < $another_data['specialties']) { $result = -2; } return $result; } );
но производительность uasort значительно хуже, чем array_multisort
Для вашего желаемого вывода используйте этот код:
<?php $waiters[76] = array('weight' => 67, 'specialties' => 1); $waiters[14] = array('weight' => 41, 'specialties' => 2); $waiters[58] = array('weight' => 85, 'specialties' => 3); $waiters[89] = array('weight' => 98, 'specialties' => 4); $waiters[68] = array('weight' => 86, 'specialties' => 5); $waiters[31] = array('weight' => 13, 'specialties' => 6); //ksort($waiters); //$waiters = array_reverse($waiters, true); print_r($waiters); // Obtain a list of waiters foreach($waiters as $id=>$w){ $w[$id] = $w['weight']; } foreach ($waiters as $ii => $va) { $sorter[$ii] = $va['weight']; } natcasesort($sorter); foreach ($sorter as $ii => $va) { $ret[$ii] = $waiters[$ii]; } echo "<pre>"; $ret = array_reverse($ret, true); print_r($ret); ?>