PHP-Сортировка массива на основе другого массива?

Хорошо, у меня уже есть этот вопрос в 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