Хорошо, у меня уже есть этот вопрос в stackoverflow, но, к сожалению, он находится в javascript – Javascript – сортирует массив на основе другого массива
и я хочу это в PHP
$data = array( "item1"=>"1", "item2"=>"3", "item3"=>"5", "item4"=>"2", "item5"=>"4" );
для соответствия расположению этого массива:
sortingArr = array("5","4","3","2","1");
и результат, который я ищу:
$data = array( "item3"=>"5", "item5"=>"4", "item2"=>"3", "item4"=>"2", "item1"=>"1" );
Любая идея, как это можно сделать? Благодарю.
Для получения подробного ответа, почему array_multisort не соответствует вашим потребностям, просмотрите этот ответ, пожалуйста: PHP array_multisort не сортирует мой многомерный массив, как ожидалось
Короче: вы хотите отсортировать массив на основе предопределенного порядка. Ответ также дан там, но я также скопировал одно решение этого ответа:
Используйте usort
и array_flip
, чтобы вы могли превратить ваш индексный массив (ValueByPosition) в массив PositionByValue .
$data = array( "item1"=>"1", "item2"=>"3", "item3"=>"5", "item4"=>"2", "item5"=>"4" ); usort($data, "sortByPredefinedOrder"); function sortByPredefinedOrder($leftItem, $rightItem){ $order = array("5","4","3","2","1"); $flipped = array_flip($order); $leftPos = $flipped[$leftItem]; $rightPos = $flipped[$rightItem]; return $leftPos >= $rightPos; } print_r($data); // usort: Array ( [0] => 5 [1] => 4 [2] => 3 [3] => 2 [4] => 1 ) // uasort: Array ( [item3] => 5 [item5] => 4 [item2] => 3 [item4] => 2 [item1] => 1 )
Однако это потребовало бы, чтобы вы спрогнозировали все возможные элементы внутри предопределенного массива заказов или соответствующим образом поделили другие элементы.
Если вы хотите сохранить ассоциированные ключи, используйте uasort
вместо usort
.
Довольно просто?
$data = array( "item1"=>"1", "item2"=>"3", "item3"=>"5", "item4"=>"2", "item5"=>"4" ); $sortingArr = array("5","4","3","2","1"); $result = array(); // result array foreach($sortingArr as $val){ // loop $result[array_search($val, $data)] = $val; // adding values } print_r($result); // print results
Вывод:
Array ( [item3] => 5 [item5] => 4 [item2] => 3 [item4] => 2 [item1] => 1 )
Посмотрите на мой следующий фрагмент, чтобы отсортировать массив на основе другого массива:
$res_arr = array(); for ($i = 0; $i < count($sortingArr); $i++) { for ($j = 0; $j < count($data); $j++) { if($data[$j] == $sortingArr[$i]) { $res_arr[] = $data[$j]; break; } } } // $res_array is your sorted array now
Посмотрите на array_multisort
. Я не совсем уверен, как использовать его, поскольку я никогда не нашел для него практического использования (я предпочитаю использовать usort
для четкого определения моих условий), но это может сработать для вас.
<?php $data = array( "item1"=>"1", "item2"=>"3", "item3"=>"5", "item4"=>"2", "item5"=>"4" ); $result=array_flip($data); krsort($result); $result=array_flip($result); print_r($result); //use rsort for the index array $sortingArr = array("5","4","3","2","1"); print_r($sortingArr);
используя usort()
the right way
я думаю
Сортировка массива по значениям с использованием пользовательской функции сравнения
вы можете сделать следующее:
$data = array( "item1"=>"1", "item2"=>"3", "item3"=>"5", "item4"=>"2", "item5"=>"4" ); $sortingArr = array("5","4","3","2","1"); $keys = array_flip($sortingArr); usort($data, function ($a, $b) use ($keys) { return $keys[$a] > $keys[$b] ? 1 : -1; }); print_r($data); // Output // Array ( [0] => 5 [1] => 4 [2] => 3 [3] => 2 [4] => 1 )
живой пример: https://3v4l.org/75cnu