PHP-Сортировка массива на основе другого массива? - программирование
Подтвердить что ты не робот

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"
 );

Любая идея, как это можно сделать? Спасибо.

4b9b3361

Ответ 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