it-swarm.com.ru

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

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

14
Rio Eduardo

Чтобы получить подробный ответ, почему array_multisort не соответствует вашим потребностям, просмотрите этот ответ, пожалуйста: PHP array_multisort не сортирует мой многомерный массив должным образом

Короче говоря: вы хотите отсортировать массив на основе предварительно определенного порядка. Ответ также дан там, но я скопировал одно решение для этого ответа:

Используйте usort и array_flip, чтобы вы могли превратить ваш indexing array (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.

8
dognose

Довольно просто?

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

Посмотрите на мой следующий фрагмент, чтобы отсортировать ваш массив на основе другого массива:

$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
1
alex

Посмотрите на фрагмент кода, чтобы сделать сортировку многомерного массива в порядке ввода

$input_format_list = [4, 1];
$data = array(
    "0" => array(
        "School" => array(
            "id" => 1,
             "name" => "ST.ANN'S HIGH SCHOOL",
        )
    ),     
    "1" => array(
        "School" => array(
            "id" => 4,
            "name" => "JYOTI VIDHYA VIHAR",
        )
    )
);   

$result = array(); // result array
foreach($input_format_list as $key => $value){ // loop
    foreach ($data as $k => $val) {
        if ($data[$k]['School']['id'] === $value) {
           $result[$key] = $data[$k];
        }
    }            
}            
return $result;
1
Nikhil Surani

Посмотрите на array_multisort . Я не совсем уверен, как его использовать, так как я никогда не находил практического использования для него (я предпочитаю использовать usort, чтобы четко определить мои термины), но это может сработать для вас.

0
Niet the Dark Absol

используя 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

0
hassan
<?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);
0
Sundar