2011-04-15 24 views
0
$arrResult=array(
0=>array('categoryid'=>112,'catname'=>'apperal','subcategory'=>array(
412=>array('categoryid'=>428,'catname'=>'rainwear','subcategory'=>array(
428=>array('categoryid'=>413,'catname'=>'summer','subcategory'=>array())))))); 

print_r($arrResult); 


$iterator = new RecursiveArrayIterator($arrResult); 
iterator_apply($iterator, 'traverseStructure', array($iterator)); 

function traverseStructure($iterator) { 
    $arrAddResult=array('categoryid'=>416,'catname'=>'winter','subcategory'=>array()); 

    while ($iterator -> valid()) { 

     if ($iterator -> hasChildren()) { 

      traverseStructure($iterator -> getChildren()); 

     } 
     else { 

      if($iterator -> current() == 413) 
      { 
       $arr=&$iterator; 
       $a='arr';       
          ${$a}['subcategory']=$arrAddResult; 
       break; 
      } 
     } 
     $iterator -> next(); 
    } 
} 

预期的输出是在$ arrResult中追加'arrAddResult'appenedn。但由于某种原因,迭代器得到修改,但它并不反映arrResult数组中的修改。添加/修改php n级关联阵列

我试着在函数'traverseStructure'中通过ref传递数组,但仍然在努力获得正确的输出。

我想先迭代器。我必须构造一个N层关联数组作为arrResult,因此可以选择使用迭代器。

+0

我不认为迭代器在这里最好用,如果我理解该代码的逻辑。这是您使用它的实际场景吗? – Khez 2011-04-15 04:03:34

+0

问题:我必须构造关联数组的N-嵌套级别。 '$ arrResult'数组是嵌套的关联数组。我想添加$ arrAddResult作为$ arrResult的一部分。 $ arrAddResult的父类是类别ID 413. 我认为Iterator会帮助我递归地走数组,当我找到匹配键时,我会将$ arrAddResult追加到$ arrResult。 如果还有其他的方法来执行这个请分享 – user269867 2011-04-15 06:20:15

+0

如果你所有的迭代器都是找到结尾数组,那么找到最后一个孩子的函数是不是更适合?你打算如何使用它?我强烈地感到在这种情况下不使用迭代器。 – Khez 2011-04-15 06:42:22

回答

0

下面是一个使用一个数组完成此操作的示例。

<?php 
$arrResult=array(
    1=>array('categoryid'=>112,'catname'=>'apperal','subcategory'=>array()), 
    0=>array('categoryid'=>112,'catname'=>'apperal','subcategory'=>array(
     1=>array('categoryid'=>112,'catname'=>'rainwear','subcategory'=>array(
      1=>array('categoryid'=>112,'catname'=>'apperal','subcategory'=>array()), 
      428=>array('categoryid'=>413,'catname'=>'summer','subcategory'=>array())) 
      ), 
     412=>array('categoryid'=>428,'catname'=>'rainwear','subcategory'=>array(
      1=>array('categoryid'=>112,'catname'=>'apperal','subcategory'=>array()), 
      428=>array('categoryid'=>413,'catname'=>'summer','subcategory'=>array())) 
      ) 
     ) 
    ) 
); 

function append(&$ar,$who,$what){ 
    // just a simple check, you can remove it 
    if(!is_array($ar))return false; 
    // loop through all keys 
    foreach($ar as $k=>$v){ 
     // found node, i'm assuming you don't have the node multiple times 
      // if you want this to go forever, remove the returns and the if on the add() 
     if($v['categoryid']==$who){ 
      $ar[$k]['subcategory'][]=$what; 
      return true; 
     } 
     // recursion ! 
     if(add($ar[$k]['subcategory'],$who,$what))return true;// if found stop 
    } 
    // key not found here in this node or subnodes 
    return false; 
} 
append($arrResult,413,array('categoryid'=>416,'catname'=>'winter','subcategory'=>array())); 
echo'<pre>'; 
var_dump($arrResult); 

这对大型数组可能是低效的。我建议创建一个缓存$ who和$ what的类,以便它不会被复制到遍历的所有级别。其余的应该是相同的。

+0

谢谢它的工作原理。我会尝试在我的主程序中使用逻辑,在那里我已经使用了递归,但是我无法正确地跟踪数组键以在正确的索引处追加数组。这将有所帮助。 – user269867 2011-04-15 12:20:35

+0

如果您需要任何帮助,请随时询问。 – Khez 2011-04-15 12:48:19

+0

也许我在读这个错误,但add()函数在哪里定义? – siliconrockstar 2014-03-17 19:59:48