PHP-Sort数组基于另一个数组?

Rio*_*rdo 14 php arrays sorting

好吧,我已经在stackoverflow中得到了这个问题,但遗憾的是它是在javascript中 - Javascript - 基于另一个数组的排序数组

我希望它在PHP中

$data = array(
   "item1"=>"1",
   "item2"=>"3",
   "item3"=>"5",
   "item4"=>"2",
   "item5"=>"4"
);
Run Code Online (Sandbox Code Playgroud)

匹配此数组的排列:

sortingArr = array("5","4","3","2","1");
Run Code Online (Sandbox Code Playgroud)

和我正在寻找的输出:

$data = array(
    "item3"=>"5",
    "item5"=>"4",
    "item2"=>"3",
    "item4"=>"2",
    "item1"=>"1"
 );
Run Code Online (Sandbox Code Playgroud)

知道如何做到这一点?谢谢.

dog*_*ose 8

有关详细解答,为什么array_multisort不符合您的需求,请查看此答案: PHP array_multisort不按预期排序我的多维数组

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

使用usortarray_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 )
Run Code Online (Sandbox Code Playgroud)

但是,这将要求您预测预定义的订单数组中的所有可能项目,或以适当的方式处理其他项目.

如果要维护关键键,请使用uasort而不是usort.


Ham*_*mZa 7

很简单?

$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
Run Code Online (Sandbox Code Playgroud)

输出:

Array
(
    [item3] => 5
    [item5] => 4
    [item2] => 3
    [item4] => 2
    [item1] => 1
)
Run Code Online (Sandbox Code Playgroud)

  • 我不认为这是一个很好的内存有效解决方案.在这种情况下,usort函数更容易,更快捷.但这仍然是小型阵列的工作解决方案.BR. (2认同)

Nie*_*sol 0

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