递归ksort:不对数组

时间:2016-06-09 15:12:22

标签: php php-5.3 php-5.5 ksort

我有一个问题 所以我有这个数组:

Array
(
[2016] => Array
    (
        [23] => Array
            (
                [total_auctions] => 0
                [total_price] => 0
            )

        [22] => Array
            (
                [total_auctions] => 0
                [total_price] => 0
            )

        [21] => Array
            (
                [total_auctions] => 0
                [total_price] => 0
            )

        [20] => Array
            (
                [total_auctions] => 0
                [total_price] => 0
            )
)

我想按键对递归进行排序。所以我创建了方法:

 public function sortNestedArrayAssoc($a)
{
    if (!is_array($a)) {
        return false;
    }
    ksort($a);
    foreach ($a as $k=>$v) {
        $this->sortNestedArrayAssoc($a[$k]);
    }
    return true;
}

但是我得到了相同的结果,带有键23的数组是第一个,我没有'真的明白问题在哪里。你能帮我吗 ? Thx提前和抱歉我的英语

1 个答案:

答案 0 :(得分:4)

John Stirling所述,您可以做的就是通过arguments by reference。您可以在方法参数中使用&运算符来执行此操作。其语法是(唯一的变化是第一行):

public function sortNestedArrayAssoc(&$a)
{
    if (!is_array($a)) {
        return false;
    }
    ksort($a);
    foreach ($a as $k=>$v) {
        $this->sortNestedArrayAssoc($a[$k]);
    }
    return true;
}

这意味着您将变量传递到函数中并直接修改它,而不是PHP通常将变量副本传递给函数的函数。 ksort是在函数定义中使用引用传递的函数示例。

如果您强烈反对使用pass by reference,则必须修改代码以将变量/数组返回到调用范围,然后更新数组。

public function sortNestedArrayAssoc($a)
{
    if (is_array($a)) {
        ksort($a);
        foreach ($a as $k=>$v) {
            $a[$k] = $this->sortNestedArrayAssoc($v);
        }
    }
    return $a;
}