2011-04-15 55 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