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"
);
Любая идея, как это можно сделать?
Спасибо.
Ответы
Ответ 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
.
Ответ 2
Довольно просто?
$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
)
Ответ 3
Посмотрите на мой следующий фрагмент, чтобы отсортировать массив на основе другого массива:
$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
Ответ 4
Взгляните на array_multisort
. Я не совсем уверен, как использовать его, поскольку я никогда не нашел для него практического использования (я предпочитаю использовать usort
для четкого определения моих условий), но он может сработать для вас.
Ответ 5
<?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);
Ответ 6
используя 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