Php 按值或引用传递,对对象数组进行递归排序

Php 按值或引用传递,对对象数组进行递归排序,php,arrays,recursion,Php,Arrays,Recursion,我有点像一个PHP新手,只是在过去几年里把它作为一种爱好 我有一个原型的对象: menu_node ->name ->order ->children 其中,子对象可能是这些相同对象的数组,因此可以深入到很多层次。我编写了一个简单的递归函数,它遍历嵌套,并对每个->子项执行usort: private function sort_node( $node ) { if ( isset($node->children) ) {

我有点像一个PHP新手,只是在过去几年里把它作为一种爱好

我有一个原型的对象:

menu_node ->name
          ->order
          ->children
其中,
子对象
可能是这些相同对象的数组,因此可以深入到很多层次。我编写了一个简单的递归函数,它遍历嵌套,并对每个
->子项执行
usort

private function sort_node( $node ) {
    if ( isset($node->children) ) {
        usort(  $node->children,
                function($a, $b) {return ($a->order == $b->order) ? 0 : ( ($a->order < $b->order) ? -1 : 1 );}
        );
        foreach ( $node->children as $child_node ) {
            $this->sort_node( $child_node );
        }
    }
    return $node;
}   
私有函数排序节点($node){
if(isset($node->children)){
usort($node->子节点,
函数($a,$b){return($a->order==$b->order)?0:($a->order<$b->order)?-1:1);}
);
foreach($node->childrenas$child\u node){
$this->sort\u节点($child\u节点);
}
}
返回$node;
}   
它似乎工作得很好。但我不确定“为什么”它工作得很好,这我不喜欢——我想确定

我担心在
foreach
循环中传入的对象会发生什么情况-我是否一直在修改传入对象的内存空间,或者我只是幸运地发现我的PHP版本和配置工作正常,但它在其他安装中的工作方式真的不确定吗

我想我不确定什么时候使用参数格式
&$node
而不是
$node
?该循环中的迭代器变量
$child\u node
也是如此


如果您对我这里的内容有任何了解或确认,我们将不胜感激。

如果我理解正确,使用&$node只意味着您不需要使用“return$node”,因为您正在更改原始对象而不是它的副本。换句话说,它目前运行良好,因为每次调用sort_节点时,都会传入一个$node的副本,该副本将被处理,然后返回。因此,您在任何时候都不会与原始对象发生冲突。当您递归时,将为$child_节点创建另一个副本,依此类推。我不认为这里有任何东西在任何运行香草PHP5的机器上都是不可移植的。@fred2--啊,好吧,这是有道理的;所以PHP的默认设置是对作为arg传递给函数的任何对象进行深度复制?但是,foreach仍然让我感到困惑……我不确定迭代器变量为什么要修改原始对象(我想我在某个地方读到了你不能依赖的东西).Yeah-这就是为什么默认情况下PHP中对递归深度有限制的原因-因此您不会得到某种最终填满内存的无休止循环。我猜想这是因为usort在传入的数组上工作(相当于使用&)。这就是说,这也不是我所期望的行为,因为$node每次都是一个副本。所以我理解你的困惑。代码中是否有其他引用传递?否,对sort\u node的初始调用使用$menu\u node对象。我几乎觉得我必须将foreach中的迭代器变量设置为&$child\u节点,以强制它成为引用,而不处理数组的副本……但这让我又回到了“为什么它现在工作正常?”