我有一个问题:
这个数组:
$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看,但我的问题没有例子。
答案 0 :(得分:0)
根据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);
?>
希望这有帮助!
答案 1 :(得分:0)
如果您想按键排序。使用uksort。请尝试下面的代码。
<?php
$aShips = array('0_204' => 1, '0_205' => 2, '0_206' => 3, '0_207' => 4);
uksort($aShips, function($a, $b) {
return $b > $a;
});
答案 2 :(得分:0)
您不需要利用排序算法。
只需翻转$order
即可将其值用作键(保持其顺序),然后合并两个数组以将$order
的不需要的值替换为$aShip
的值。
这当然假设$aShip
包括$order
中表示的所有键值。如果没有,array_intersect_key()
可以用于过滤$order
,但这只是在问题未包含的附带情况下使用。
代码:(Demo)
var_export(array_replace(array_flip($order), $aShips));
输出:
array (
'0_206' => 3,
'0_205' => 2,
'0_204' => 1,
'0_207' => 4,
)
当您没有在$order
中列出所有出现的键时,这也会起作用-未列出的键会“移到后面”。经过Demo的验证。
可以使用自定义排序算法 ,并且会有很多方法,但是为了比较,我只展示一种方法。
颠倒您的订单数组并将其用作查找数组,同时要求uksort()
以降序排序。如果在查找中找不到遇到的键,请为其分配值-1,以确保其移到数组的后面。
代码:(Demo)
$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
和{{ 1}})。
如果这篇文章被否决,我向研究人员表示歉意。我的正确,解释,演示和有见地的答案已经被否决了几个月,对此我几乎无能为力。相信演示链接可以作为证明,不要因负面的投票而偏颇。