[英]How to custom sort php array with uasort
我有一个问题:
这个数组:
$aShips = array('0_204' => 1, '0_205' => 2, '0_206' => 3, '0_207' => 4);
必须是:
array(4) { ["'0_206'"]=> int(3) ["'0_205'"]=> int(2) ["'0_204'"]=> int(1) ["'0_207'"]=> int(4) }
//order like this (can be different)
$order = array("0_206", "0_205", "0_204", "0_207");
//this sort it not like my custom order
function cmp($a, $b){
if ($a==$b) return 0;
return ($a<$b)?-1:1;
}
uasort($aShips, "cmp");
我查看了 w3school,但没有针对我的问题的示例。
您不需要利用排序算法。
只需翻转$order
以使用其值作为键(保持它们的顺序),然后合并两个数组,用$aShip
的值替换$order
不需要的值。
当然,这假设$aShip
包括$order
表示的所有键值。 如果不是,则array_intersect_key()
可用于过滤$order
,但这是针对未包含在已发布问题中的边缘案例。
代码:(演示)
var_export(array_replace(array_flip($order), $aShips));
输出:
array (
'0_206' => 3,
'0_205' => 2,
'0_204' => 1,
'0_207' => 4,
)
当您没有在$order
列出每个出现的键时,这也有效——未列出的键被“移到后面”。 由这个Demo证明。
使用自定义排序算法可以完成,将有多种方式,但我将只展示一个比较的缘故。
反转您的 order 数组并将其用作查找数组,同时要求uksort()
以降序方式排序。 如果在查找中找不到遇到的键,则为其分配值 -1 以确保它移动到数组的后面。
代码:(演示)
$lookup = array_flip(array_reverse($order));
uksort($aShips, function($a, $b) use ($lookup) {
return ($lookup[$b] ?? -1) <=> ($lookup[$a] ?? -1);
});
var_export($aShips);
如果你不喜欢颠倒查找和排序 DESC,你可以在翻转之前提取$order
的最高索引并递增它。 然后,这个新的“最高数字”将通过use()
传递到自定义函数作用域中,然后在我写的-1
,然后将应用 ASC 比较( a
在左侧, b
在右侧)。
如果这篇文章被否决,我为这个社区的状况向研究人员道歉。 我的正确、解释、演示、有见地的答案几个月来一直被低估,我对此无能为力。 相信演示链接作为证据,不要被否定票数所偏见。
根据Official PHP Docs ,您可以像这样使用uasort()
(仅用于演示):
<?php
// Comparison function
function cmp($a, $b) {
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
// Array to be sorted
$array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4);
print_r($array);
// Sort and print the resulting array
uasort($array, 'cmp');
print_r($array);
?>
希望这有帮助!
如果要按键排序。 使用 uksort。 试试下面的代码。
<?php
$aShips = array('0_204' => 1, '0_205' => 2, '0_206' => 3, '0_207' => 4);
uksort($aShips, function($a, $b) {
return $b > $a;
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.