Intereting Posts
Когда (если вообще когда-либо) не является злом? Как я могу гарантировать, что все ключевые имена в PHP, сгенерированном JSON, являются строками? Как работать с файлами cookie в Laravel 5.2 Итерация по сложному ассоциативному массиву в PHP Простая математика с десятичными знаками в PHP Маршрут к контроллеру в подпапке, не работающей в Laravel 4 php-redis – Есть ли способ сохранить объект PHP в Redis без его сериализации? Как сделать мою функцию сброса пароля codeiginter безопасной? PHP / MySQL – Хранение данных массива как JSON, плохая практика? Smarty PHP столкнулся с AngularJS Каков наилучший шаблон проектирования для разработки интерфейса WebPage? Как я могу удалить ведущие и завершающие символы без буквенно-цифровых символов в PHP? SugarCRM On-Demand Преобразует TextField в DropDown Предупреждение: mysql_query () : доступ запрещен для пользователя «ODBC» @ «localhost» (с использованием пароля: НЕТ) Игнорировать ошибку загрузки изображения

array_multisort с поддержкой ассоциации числовых индексов

Я могу сортировать многомерный массив, но не поддерживая ассоциацию числовых индексов.

Как сохранить ассоциацию числовых индексов?

КОД:

$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 ) ) 

    Related of "array_multisort с поддержкой ассоциации числовых индексов"

     $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); ?>