【问题标题】:How can I custom sort php array with uasort?如何使用 uasort 自定义排序 php 数组?
【发布时间】:2017-04-13 14:40:57
【问题描述】:

这个数组:

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

【问题讨论】:

  • 为什么0_207 会在数组的末尾
  • 这只是一个例子。我想每次都像我的 $order 数组一样订购 $aShips 数组。 (带 val 的键)

标签: php arrays sorting


【解决方案1】:

根据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);
?>

【讨论】:

  • 你好 Saumya Rastogi,我试过了,但我没有按我的自定义键对数组进行排序。
【解决方案2】:

您不需要利用排序算法。

只需翻转$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证明。


使用自定义排序算法可以完成,并且有多种方法,但为了比较,我只展示一种。

反转您的 order 数组并将其用作查找数组,同时要求 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,右侧为b)。

【讨论】:

    【解决方案3】:

    如果你想按键排序。使用 uksort。试试下面的代码。

    <?php
    
    $aShips = array('0_204' => 1, '0_205' => 2, '0_206' => 3, '0_207' => 4);
    
    uksort($aShips, function($a, $b) {
        return $b > $a;
    });
    

    【讨论】:

    • 这是相同的数组,但相反。我想更改完整的订单
    • 我不确定您所说的“我喜欢更改完整订单”是什么意思。必须有一个标准来排序。我不确定您是要打乱顺序还是删除键或值。看着你的例子很令人困惑。您能否详细说明排序的标准?
    • 我喜欢这样订购:array("0_206", "0_205", "0_204", "0_207");
    • 或类似数组("0_207", "0_204", "0_206", "0_205");等等(比如我的比较数组“$order”。对不起我的英语不好
    • 如果你想要自定义顺序,那么你可以遍历数组并按照你想要的顺序创建一个新数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多