如何使用uasort自定义php数组

时间:2016-11-29 14:41:06

标签: php arrays sorting

我有一个问题:

这个数组:

$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看,但我的问题没有例子。

3 个答案:

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

如果这篇文章被否决,我向研究人员表示歉意。我的正确,解释,演示和有见地的答案已经被否决了几个月,对此我几乎无能为力。相信演示链接可以作为证明,不要因负面的投票而偏颇。