PHP内部数组指针在foreach递归函数中通过引用传递变量的问题


PHP internal array pointer issue with variable passed by reference in recursive function with foreach

我正在尝试构建具有父子关系的分层关联数组。输入数据是一个元素数组。每个元素都有一个id和一个parent-id。

为了效率,当一个元素找到它的父元素时,我想从源数据中删除该子元素,这样循环就不会浪费在检查该元素是否是其他元素的子元素上。

代码如下:

// parentid == 0 indicates a root node
function buildTree(&$elements, $parentid=0){
    $branch = array();
    foreach($elements as $key => $element){
        if($element['parentid'] == $parentid){
            $twig = $element;
            unset($elements[$key]);
            $twig['children'] = buildTree($elements, $element['pageid']);
            $branch[] = $twig;
        }
    }
    return $branch;
}

我遇到的问题是,在某些情况下,一些元素永远找不到它们的父元素。

我认为这是因为$elements变量是通过引用传递的,而更深层次的递归正在破坏外部级别的内部数组指针的位置,导致其他子级被跳过,而不是在外部级别的foreach循环中被触及。

我试着看看是否有一种方法来保存内部数组指针的位置在另一个递归级别之前,然后在函数返回时恢复位置,但它似乎不可能在PHP中实现。

如果我把&拿出来,不通过引用传递$elements变量,那么函数就可以完美地工作。不幸的是,这使得元素被foreach处理,即使它们已经保存在它们适当的父元素下,也浪费了一些处理时间。

关于如何从未排序的元素池中删除子元素,他们已经被分配给他们的父元素的想法吗?

编辑:当然一些示例数据会有所帮助:

$source_data = unserialize('a:33:{i:0;a:5:{s:6:"pageid";s:2:"53";s:3:"key";s:2:"53";s:8:"parentid";s:2:"52";s:7:"tooltip";s:0:"";s:5:"title";s:8:"Example 2.0";}i:1;a:5:{s:6:"pageid";s:2:"68";s:3:"key";s:2:"68";s:8:"parentid";s:2:"53";s:7:"tooltip";s:0:"";s:5:"title";s:5:"Audit";}i:2;a:5:{s:6:"pageid";s:2:"65";s:3:"key";s:2:"65";s:8:"parentid";s:2:"25";s:7:"tooltip";s:26:"CastIron Deployment Helper";s:5:"title";s:8:"helper";}i:3;a:5:{s:6:"pageid";s:2:"50";s:3:"key";s:2:"50";s:8:"parentid";s:2:"49";s:7:"tooltip";s:17:"Calendar Template";s:5:"title";s:8:"Calendar";}i:4;a:5:{s:6:"pageid";s:2:"28";s:3:"key";s:2:"28";s:8:"parentid";s:2:"27";s:7:"tooltip";s:0:"";s:5:"title";s:15:"querty Gifts";}i:5;a:5:{s:6:"pageid";s:2:"24";s:3:"key";s:2:"24";s:8:"parentid";s:1:"0";s:7:"tooltip";s:0:"";s:5:"title";s:4:"More_Samples";}i:6;a:5:{s:6:"pageid";s:2:"35";s:3:"key";s:2:"35";s:8:"parentid";s:1:"0";s:7:"tooltip";s:38:"Ideas for features of this wiki webapp";s:5:"title";s:6:"Design";}i:7;a:5:{s:6:"pageid";s:2:"70";s:3:"key";s:2:"70";s:8:"parentid";s:2:"25";s:7:"tooltip";s:0:"";s:5:"title";s:26:"Environments & Credentials";}i:8;a:5:{s:6:"pageid";s:2:"67";s:3:"key";s:2:"67";s:8:"parentid";s:2:"36";s:7:"tooltip";s:0:"";s:5:"title";s:19:"Helping Downstreams";}i:9;a:5:{s:6:"pageid";s:1:"1";s:3:"key";s:1:"1";s:8:"parentid";s:1:"0";s:7:"tooltip";s:0:"";s:5:"title";s:4:"Home";}i:10;a:5:{s:6:"pageid";s:2:"64";s:3:"key";s:2:"64";s:8:"parentid";s:2:"53";s:7:"tooltip";s:0:"";s:5:"title";s:5:"ITC02";}i:11;a:5:{s:6:"pageid";s:2:"27";s:3:"key";s:2:"27";s:8:"parentid";s:1:"0";s:7:"tooltip";s:0:"";s:5:"title";s:14:"More_Samples topics";}i:12;a:5:{s:6:"pageid";s:2:"26";s:3:"key";s:2:"26";s:8:"parentid";s:2:"25";s:7:"tooltip";s:0:"";s:5:"title";s:2:"MQ";}i:13;a:5:{s:6:"pageid";s:2:"55";s:3:"key";s:2:"55";s:8:"parentid";s:2:"36";s:7:"tooltip";s:0:"";s:5:"title";s:5:"Music";}i:14;a:5:{s:6:"pageid";s:2:"73";s:3:"key";s:2:"73";s:8:"parentid";s:2:"52";s:7:"tooltip";s:0:"";s:5:"title";s:5:"Other";}i:15;a:5:{s:6:"pageid";s:2:"29";s:3:"key";s:2:"29";s:8:"parentid";s:1:"1";s:7:"tooltip";s:0:"";s:5:"title";s:3:"Sample";}i:16;a:5:{s:6:"pageid";s:2:"34";s:3:"key";s:2:"34";s:8:"parentid";s:2:"29";s:7:"tooltip";s:0:"";s:5:"title";s:14:"Sample 2013 Goals";}i:17;a:5:{s:6:"pageid";s:2:"33";s:3:"key";s:2:"33";s:8:"parentid";s:2:"29";s:7:"tooltip";s:0:"";s:5:"title";s:8:"Sample 2014";}i:18;a:5:{s:6:"pageid";s:2:"31";s:3:"key";s:2:"31";s:8:"parentid";s:2:"29";s:7:"tooltip";s:0:"";s:5:"title";s:6:"Sample R2";}i:19;a:5:{s:6:"pageid";s:2:"32";s:3:"key";s:2:"32";s:8:"parentid";s:2:"29";s:7:"tooltip";s:0:"";s:5:"title";s:13:"Sample Text Only";}i:20;a:5:{s:6:"pageid";s:2:"25";s:3:"key";s:2:"25";s:8:"parentid";s:1:"0";s:7:"tooltip";s:0:"";s:5:"title";s:9:"Reference";}i:21;a:5:{s:6:"pageid";s:2:"62";s:3:"key";s:2:"62";s:8:"parentid";s:2:"52";s:7:"tooltip";s:0:"";s:5:"title";s:8:"S&D reps";}i:22;a:5:{s:6:"pageid";s:2:"36";s:3:"key";s:2:"36";s:8:"parentid";s:1:"0";s:7:"tooltip";s:0:"";s:5:"title";s:7:"Sandbox";}i:23;a:5:{s:6:"pageid";s:2:"71";s:3:"key";s:2:"71";s:8:"parentid";s:2:"52";s:7:"tooltip";s:0:"";s:5:"title";s:9:"Schedules";}i:24;a:5:{s:6:"pageid";s:2:"72";s:3:"key";s:2:"72";s:8:"parentid";s:2:"52";s:7:"tooltip";s:0:"";s:5:"title";s:9:"Schedules";}i:25;a:5:{s:6:"pageid";s:2:"51";s:3:"key";s:2:"51";s:8:"parentid";s:1:"0";s:7:"tooltip";s:0:"";s:5:"title";s:13:"Special Pages";}i:26;a:5:{s:6:"pageid";s:2:"63";s:3:"key";s:2:"63";s:8:"parentid";s:2:"35";s:7:"tooltip";s:36:"How to handle tasks and task parsing";s:5:"title";s:5:"Tasks";}i:27;a:5:{s:6:"pageid";s:2:"49";s:3:"key";s:2:"49";s:8:"parentid";s:1:"0";s:7:"tooltip";s:47:"Template pages for use when creating new pages.";s:5:"title";s:9:"Templates";}i:28;a:5:{s:6:"pageid";s:2:"52";s:3:"key";s:2:"52";s:8:"parentid";s:1:"0";s:7:"tooltip";s:0:"";s:5:"title";s:4:"Work";}i:29;a:5:{s:6:"pageid";s:2:"14";s:3:"key";s:2:"14";s:8:"parentid";s:1:"1";s:7:"tooltip";s:0:"";s:5:"title";s:8:"another!";}i:30;a:5:{s:6:"pageid";s:2:"54";s:3:"key";s:2:"54";s:8:"parentid";s:2:"25";s:7:"tooltip";s:0:"";s:5:"title";s:4:"tmux";}i:31;a:5:{s:6:"pageid";s:2:"12";s:3:"key";s:2:"12";s:8:"parentid";s:1:"1";s:7:"tooltip";s:0:"";s:5:"title";s:5:"what?";}i:32;a:5:{s:6:"pageid";s:2:"13";s:3:"key";s:2:"13";s:8:"parentid";s:1:"1";s:7:"tooltip";s:0:"";s:5:"title";s:5:"zippy";}}');
$correct_result = unserialize('a:9:{i:0;a:7:{s:6:"pageid";s:2:"24";s:3:"key";s:2:"24";s:8:"parentid";s:1:"0";s:7:"tooltip";s:0:"";s:5:"title";s:4:"More_Samples";s:4:"href";s:8:"?page=24";s:8:"children";a:0:{}}i:1;a:7:{s:6:"pageid";s:2:"35";s:3:"key";s:2:"35";s:8:"parentid";s:1:"0";s:7:"tooltip";s:38:"Ideas for features of this wiki webapp";s:5:"title";s:6:"Design";s:4:"href";s:8:"?page=35";s:8:"children";a:1:{i:0;a:7:{s:6:"pageid";s:2:"63";s:3:"key";s:2:"63";s:8:"parentid";s:2:"35";s:7:"tooltip";s:36:"How to handle tasks and task parsing";s:5:"title";s:5:"Tasks";s:4:"href";s:8:"?page=63";s:8:"children";a:0:{}}}}i:2;a:7:{s:6:"pageid";s:1:"1";s:3:"key";s:1:"1";s:8:"parentid";s:1:"0";s:7:"tooltip";s:0:"";s:5:"title";s:4:"Home";s:4:"href";s:7:"?page=1";s:8:"children";a:4:{i:0;a:7:{s:6:"pageid";s:2:"29";s:3:"key";s:2:"29";s:8:"parentid";s:1:"1";s:7:"tooltip";s:0:"";s:5:"title";s:3:"Sample";s:4:"href";s:8:"?page=29";s:8:"children";a:4:{i:0;a:7:{s:6:"pageid";s:2:"34";s:3:"key";s:2:"34";s:8:"parentid";s:2:"29";s:7:"tooltip";s:0:"";s:5:"title";s:14:"Sample 2013 Goals";s:4:"href";s:8:"?page=34";s:8:"children";a:0:{}}i:1;a:7:{s:6:"pageid";s:2:"33";s:3:"key";s:2:"33";s:8:"parentid";s:2:"29";s:7:"tooltip";s:0:"";s:5:"title";s:8:"Sample 2014";s:4:"href";s:8:"?page=33";s:8:"children";a:0:{}}i:2;a:7:{s:6:"pageid";s:2:"31";s:3:"key";s:2:"31";s:8:"parentid";s:2:"29";s:7:"tooltip";s:0:"";s:5:"title";s:6:"Sample R2";s:4:"href";s:8:"?page=31";s:8:"children";a:0:{}}i:3;a:7:{s:6:"pageid";s:2:"32";s:3:"key";s:2:"32";s:8:"parentid";s:2:"29";s:7:"tooltip";s:0:"";s:5:"title";s:13:"Sample Text Only";s:4:"href";s:8:"?page=32";s:8:"children";a:0:{}}}}i:1;a:7:{s:6:"pageid";s:2:"14";s:3:"key";s:2:"14";s:8:"parentid";s:1:"1";s:7:"tooltip";s:0:"";s:5:"title";s:8:"another!";s:4:"href";s:8:"?page=14";s:8:"children";a:0:{}}i:2;a:7:{s:6:"pageid";s:2:"12";s:3:"key";s:2:"12";s:8:"parentid";s:1:"1";s:7:"tooltip";s:0:"";s:5:"title";s:5:"what?";s:4:"href";s:8:"?page=12";s:8:"children";a:0:{}}i:3;a:7:{s:6:"pageid";s:2:"13";s:3:"key";s:2:"13";s:8:"parentid";s:1:"1";s:7:"tooltip";s:0:"";s:5:"title";s:5:"zippy";s:4:"href";s:8:"?page=13";s:8:"children";a:0:{}}}}i:3;a:7:{s:6:"pageid";s:2:"27";s:3:"key";s:2:"27";s:8:"parentid";s:1:"0";s:7:"tooltip";s:0:"";s:5:"title";s:14:"More_Samples topics";s:4:"href";s:8:"?page=27";s:8:"children";a:1:{i:0;a:7:{s:6:"pageid";s:2:"28";s:3:"key";s:2:"28";s:8:"parentid";s:2:"27";s:7:"tooltip";s:0:"";s:5:"title";s:15:"querty Gifts";s:4:"href";s:8:"?page=28";s:8:"children";a:0:{}}}}i:4;a:7:{s:6:"pageid";s:2:"25";s:3:"key";s:2:"25";s:8:"parentid";s:1:"0";s:7:"tooltip";s:0:"";s:5:"title";s:9:"Reference";s:4:"href";s:8:"?page=25";s:8:"children";a:4:{i:0;a:7:{s:6:"pageid";s:2:"65";s:3:"key";s:2:"65";s:8:"parentid";s:2:"25";s:7:"tooltip";s:26:"CastIron Deployment Helper";s:5:"title";s:8:"helper";s:4:"href";s:8:"?page=65";s:8:"children";a:0:{}}i:1;a:7:{s:6:"pageid";s:2:"70";s:3:"key";s:2:"70";s:8:"parentid";s:2:"25";s:7:"tooltip";s:0:"";s:5:"title";s:26:"Environments & Credentials";s:4:"href";s:8:"?page=70";s:8:"children";a:0:{}}i:2;a:7:{s:6:"pageid";s:2:"26";s:3:"key";s:2:"26";s:8:"parentid";s:2:"25";s:7:"tooltip";s:0:"";s:5:"title";s:2:"MQ";s:4:"href";s:8:"?page=26";s:8:"children";a:0:{}}i:3;a:7:{s:6:"pageid";s:2:"54";s:3:"key";s:2:"54";s:8:"parentid";s:2:"25";s:7:"tooltip";s:0:"";s:5:"title";s:4:"tmux";s:4:"href";s:8:"?page=54";s:8:"children";a:0:{}}}}i:5;a:7:{s:6:"pageid";s:2:"36";s:3:"key";s:2:"36";s:8:"parentid";s:1:"0";s:7:"tooltip";s:0:"";s:5:"title";s:7:"Sandbox";s:4:"href";s:8:"?page=36";s:8:"children";a:2:{i:0;a:7:{s:6:"pageid";s:2:"67";s:3:"key";s:2:"67";s:8:"parentid";s:2:"36";s:7:"tooltip";s:0:"";s:5:"title";s:19:"Helping Downstreams";s:4:"href";s:8:"?page=67";s:8:"children";a:0:{}}i:1;a:7:{s:6:"pageid";s:2:"55";s:3:"key";s:2:"55";s:8:"parentid";s:2:"36";s:7:"tooltip";s:0:"";s:5:"title";s:5:"Music";s:4:"href";s:8:"?page=55";s:8:"children";a:0:{}}}}i:6;a:7:{s:6:"pageid";s:2:"51";s:3:"key";s:2:"51";s:8:"parentid";s:1:"0";s:7:"tooltip";s:0:"";s:5:"title";s:13:"Special Pages";s:4:"href";s:8:"?page=51";s:8:"children";a:0:{}}i:7;a:7:{s:6:"pageid";s:2:"49";s:3:"key";s:2:"49";s:8:"parentid";s:1:"0";s:7:"tooltip";s:47:"Template pages for use when creating new pages.";s:5:"title";s:9:"Templates";s:4:"href";s:8:"?page=49";s:8:"children";a:1:{i:0;a:7:{s:6:"pageid";s:2:"50";s:3:"key";s:2:"50";s:8:"parentid";s:2:"49";s:7:"tooltip";s:17:"Calendar Template";s:5:"title";s:8:"Calendar";s:4:"href";s:8:"?page=50";s:8:"children";a:0:{}}}}i:8;a:7:{s:6:"pageid";s:2:"52";s:3:"key";s:2:"52";s:8:"parentid";s:1:"0";s:7:"tooltip";s:0:"";s:5:"title";s:4:"Work";s:4:"href";s:8:"?page=52";s:8:"children";a:5:{i:0;a:7:{s:6:"pageid";s:2:"53";s:3:"key";s:2:"53";s:8:"parentid";s:2:"52";s:7:"tooltip";s:0:"";s:5:"title";s:8:"Example 2.0";s:4:"href";s:8:"?page=53";s:8:"children";a:2:{i:0;a:7:{s:6:"pageid";s:2:"68";s:3:"key";s:2:"68";s:8:"parentid";s:2:"53";s:7:"tooltip";s:0:"";s:5:"title";s:5:"Audit";s:4:"href";s:8:"?page=68";s:8:"children";a:0:{}}i:1;a:7:{s:6:"pageid";s:2:"64";s:3:"key";s:2:"64";s:8:"parentid";s:2:"53";s:7:"tooltip";s:0:"";s:5:"title";s:5:"ITC02";s:4:"href";s:8:"?page=64";s:8:"children";a:0:{}}}}i:1;a:7:{s:6:"pageid";s:2:"73";s:3:"key";s:2:"73";s:8:"parentid";s:2:"52";s:7:"tooltip";s:0:"";s:5:"title";s:5:"Other";s:4:"href";s:8:"?page=73";s:8:"children";a:0:{}}i:2;a:7:{s:6:"pageid";s:2:"62";s:3:"key";s:2:"62";s:8:"parentid";s:2:"52";s:7:"tooltip";s:0:"";s:5:"title";s:8:"S&D reps";s:4:"href";s:8:"?page=62";s:8:"children";a:0:{}}i:3;a:7:{s:6:"pageid";s:2:"71";s:3:"key";s:2:"71";s:8:"parentid";s:2:"52";s:7:"tooltip";s:0:"";s:5:"title";s:9:"Schedules";s:4:"href";s:8:"?page=71";s:8:"children";a:0:{}}i:4;a:7:{s:6:"pageid";s:2:"72";s:3:"key";s:2:"72";s:8:"parentid";s:2:"52";s:7:"tooltip";s:0:"";s:5:"title";s:9:"Schedules";s:4:"href";s:8:"?page=72";s:8:"children";a:0:{}}}}}';
$by_reference = unserialize('a:9:{i:0;a:7:{s:6:"pageid";s:2:"24";s:3:"key";s:2:"24";s:8:"parentid";s:1:"0";s:7:"tooltip";s:0:"";s:5:"title";s:4:"More_Samples";s:4:"href";s:8:"?page=24";s:8:"children";a:0:{}}i:1;a:7:{s:6:"pageid";s:2:"35";s:3:"key";s:2:"35";s:8:"parentid";s:1:"0";s:7:"tooltip";s:38:"Ideas for features of this wiki webapp";s:5:"title";s:6:"Design";s:4:"href";s:8:"?page=35";s:8:"children";a:1:{i:0;a:7:{s:6:"pageid";s:2:"63";s:3:"key";s:2:"63";s:8:"parentid";s:2:"35";s:7:"tooltip";s:36:"How to handle tasks and task parsing";s:5:"title";s:5:"Tasks";s:4:"href";s:8:"?page=63";s:8:"children";a:0:{}}}}i:2;a:7:{s:6:"pageid";s:1:"1";s:3:"key";s:1:"1";s:8:"parentid";s:1:"0";s:7:"tooltip";s:0:"";s:5:"title";s:4:"Home";s:4:"href";s:7:"?page=1";s:8:"children";a:1:{i:0;a:7:{s:6:"pageid";s:2:"29";s:3:"key";s:2:"29";s:8:"parentid";s:1:"1";s:7:"tooltip";s:0:"";s:5:"title";s:3:"Sample";s:4:"href";s:8:"?page=29";s:8:"children";a:4:{i:0;a:7:{s:6:"pageid";s:2:"34";s:3:"key";s:2:"34";s:8:"parentid";s:2:"29";s:7:"tooltip";s:0:"";s:5:"title";s:14:"Sample 2013 Goals";s:4:"href";s:8:"?page=34";s:8:"children";a:0:{}}i:1;a:7:{s:6:"pageid";s:2:"33";s:3:"key";s:2:"33";s:8:"parentid";s:2:"29";s:7:"tooltip";s:0:"";s:5:"title";s:8:"Sample 2014";s:4:"href";s:8:"?page=33";s:8:"children";a:0:{}}i:2;a:7:{s:6:"pageid";s:2:"31";s:3:"key";s:2:"31";s:8:"parentid";s:2:"29";s:7:"tooltip";s:0:"";s:5:"title";s:6:"Sample R2";s:4:"href";s:8:"?page=31";s:8:"children";a:0:{}}i:3;a:7:{s:6:"pageid";s:2:"32";s:3:"key";s:2:"32";s:8:"parentid";s:2:"29";s:7:"tooltip";s:0:"";s:5:"title";s:13:"Sample Text Only";s:4:"href";s:8:"?page=32";s:8:"children";a:0:{}}}}}}i:3;a:7:{s:6:"pageid";s:2:"27";s:3:"key";s:2:"27";s:8:"parentid";s:1:"0";s:7:"tooltip";s:0:"";s:5:"title";s:14:"More_Samples topics";s:4:"href";s:8:"?page=27";s:8:"children";a:1:{i:0;a:7:{s:6:"pageid";s:2:"28";s:3:"key";s:2:"28";s:8:"parentid";s:2:"27";s:7:"tooltip";s:0:"";s:5:"title";s:15:"querty Gifts";s:4:"href";s:8:"?page=28";s:8:"children";a:0:{}}}}i:4;a:7:{s:6:"pageid";s:2:"25";s:3:"key";s:2:"25";s:8:"parentid";s:1:"0";s:7:"tooltip";s:0:"";s:5:"title";s:9:"Reference";s:4:"href";s:8:"?page=25";s:8:"children";a:4:{i:0;a:7:{s:6:"pageid";s:2:"65";s:3:"key";s:2:"65";s:8:"parentid";s:2:"25";s:7:"tooltip";s:26:"CastIron Deployment Helper";s:5:"title";s:8:"helper";s:4:"href";s:8:"?page=65";s:8:"children";a:0:{}}i:1;a:7:{s:6:"pageid";s:2:"70";s:3:"key";s:2:"70";s:8:"parentid";s:2:"25";s:7:"tooltip";s:0:"";s:5:"title";s:26:"Environments & Credentials";s:4:"href";s:8:"?page=70";s:8:"children";a:0:{}}i:2;a:7:{s:6:"pageid";s:2:"26";s:3:"key";s:2:"26";s:8:"parentid";s:2:"25";s:7:"tooltip";s:0:"";s:5:"title";s:2:"MQ";s:4:"href";s:8:"?page=26";s:8:"children";a:0:{}}i:3;a:7:{s:6:"pageid";s:2:"54";s:3:"key";s:2:"54";s:8:"parentid";s:2:"25";s:7:"tooltip";s:0:"";s:5:"title";s:4:"tmux";s:4:"href";s:8:"?page=54";s:8:"children";a:0:{}}}}i:5;a:7:{s:6:"pageid";s:2:"36";s:3:"key";s:2:"36";s:8:"parentid";s:1:"0";s:7:"tooltip";s:0:"";s:5:"title";s:7:"Sandbox";s:4:"href";s:8:"?page=36";s:8:"children";a:2:{i:0;a:7:{s:6:"pageid";s:2:"67";s:3:"key";s:2:"67";s:8:"parentid";s:2:"36";s:7:"tooltip";s:0:"";s:5:"title";s:19:"Helping Downstreams";s:4:"href";s:8:"?page=67";s:8:"children";a:0:{}}i:1;a:7:{s:6:"pageid";s:2:"55";s:3:"key";s:2:"55";s:8:"parentid";s:2:"36";s:7:"tooltip";s:0:"";s:5:"title";s:5:"Music";s:4:"href";s:8:"?page=55";s:8:"children";a:0:{}}}}i:6;a:7:{s:6:"pageid";s:2:"51";s:3:"key";s:2:"51";s:8:"parentid";s:1:"0";s:7:"tooltip";s:0:"";s:5:"title";s:13:"Special Pages";s:4:"href";s:8:"?page=51";s:8:"children";a:0:{}}i:7;a:7:{s:6:"pageid";s:2:"49";s:3:"key";s:2:"49";s:8:"parentid";s:1:"0";s:7:"tooltip";s:47:"Template pages for use when creating new pages.";s:5:"title";s:9:"Templates";s:4:"href";s:8:"?page=49";s:8:"children";a:1:{i:0;a:7:{s:6:"pageid";s:2:"50";s:3:"key";s:2:"50";s:8:"parentid";s:2:"49";s:7:"tooltip";s:17:"Calendar Template";s:5:"title";s:8:"Calendar";s:4:"href";s:8:"?page=50";s:8:"children";a:0:{}}}}i:8;a:7:{s:6:"pageid";s:2:"52";s:3:"key";s:2:"52";s:8:"parentid";s:1:"0";s:7:"tooltip";s:0:"";s:5:"title";s:4:"Work";s:4:"href";s:8:"?page=52";s:8:"children";a:1:{i:0;a:7:{s:6:"pageid";s:2:"53";s:3:"key";s:2:"53";s:8:"parentid";s:2:"52";s:7:"tooltip";s:0:"";s:5:"title";s:8:"Example 2.0";s:4:"href";s:8:"?page=53";s:8:"children";a:2:{i:0;a:7:{s:6:"pageid";s:2:"68";s:3:"key";s:2:"68";s:8:"parentid";s:2:"53";s:7:"tooltip";s:0:"";s:5:"title";s:5:"Audit";s:4:"href";s:8:"?page=68";s:8:"children";a:0:{}}i:1;a:7:{s:6:"pageid";s:2:"64";s:3:"key";s:2:"64";s:8:"parentid";s:2:"53";s:7:"tooltip";s:0:"";s:5:"title";s:5:"ITC02";s:4:"href";s:8:"?page=64";s:8:"children";a:0:{}}}}}}}';

$source_data是未排序的源数据,$correct_result是当我不通过引用传递$elements时得到的(这就是我想要的),$by_reference是当我通过引用传递&$elements时得到的(不正确的结果)。

你必须重新索引$elements数组后unset尝试这个..

unset($elements[$key]);
$temp_array=array_values($elements);
$twig['children'] = buildTree($temp_array, $element['id']);