基于另一个数组的 PHP 排序数组?

2022-08-31 00:57:07

好吧,我已经在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未按预期对我的多维数组进行排序

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

使用 和 ,以便能够将索引数组 (ValueByPosition) 转换为 PositionByValue 数组。usortarray_flip

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

但是,这将要求您预测预定义订单数组内的所有可能项,或以适当的方式线程其他项。

如果要维护 assoc 键,请使用 代替 。uasortusort


答案 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
)