16

好的,我已经在 stackoverflow 中得到了这个问题,但遗憾的是它在 javascript - Javascript - sort array based on another array

我想要它在 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"
 );

知道如何做到这一点吗?谢谢。

4

8 回答 8

11

有关详细答案,为什么 array_multisort 不符合您的需求,请查看此答案: PHP array_multisort not sort my multidimensional array as expected

简而言之:您希望根据预定义的顺序对数组进行排序。那里也给出了答案,但我也复制了一个解决方案来解决这个问题:

使用usortand 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.

于 2013-06-27T08:35:05.487 回答
10

很简单?

$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
)
于 2013-06-27T08:27:18.333 回答
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
于 2013-06-27T08:29:18.573 回答
1

我为我的解决方案感到非常自豪:

uasort($data, function($a, $b) use ($sortingArr) {  
    return array_search($a, $sortingArr) <=> array_search($b, $sortingArr);
});

工作示例:https ://3v4l.org/bbIk2

  1. 它用于uasort维护 OP 请求的键值关联。(不像@hassan 的其他优雅的解决方案)
  2. 它不要求 $data 数组中的每个元素都存在于排序数组中。(就像@HamZa 的解决方案)
  3. 很简短。
  4. 它使用 spaceship 运算符<=>进行比较,而不是更冗长的逻辑。

代码:

于 2021-05-04T02:53:00.287 回答
1

使用我认为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

于 2017-03-19T11:43:46.297 回答
1

查看代码片段以按输入顺序对多维数组进行排序

$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;
于 2018-03-23T09:33:51.147 回答
0
<?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);
于 2013-06-27T08:30:26.673 回答
0

看看array_multisort。我不完全确定如何使用它,因为我从未找到它的实际用途(我更喜欢用它usort来明确定义我的术语),但它可能对你有用。

于 2013-06-27T08:19:38.513 回答