【问题标题】:Recursive ksort : not sort the array递归 ksort :不对数组进行排序
【发布时间】:2016-06-09 15:12:21
【问题描述】:

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

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 的数组是第一个,我真的不明白问题出在哪里。你能帮我吗 ?提前谢谢,对不起我的英语

【问题讨论】:

  • 您需要通过引用传递方法arg。

标签: php php-5.3 php-5.5 ksort


【解决方案1】:

正如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 是一个在函数定义中使用引用传递的函数示例。

如果您强烈反对使用按引用传递,则必须修改代码以将变量/数组返回到调用范围,然后在其中更新数组。

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

【讨论】:

  • 通过引用而不是值传递它有什么好处?
  • 大多数情况下的偏好。您将通过引用传递来节省内存使用量(因为 PHP 不必复制您的变量,它只会在适当的位置修改它)。
  • 感谢您的回复。似乎通过引用传递的性能较慢,所以我只是不确定何时使用它。 *.com/questions/178328/…