добавить / изменить ассоциативный массив уровня php n - PullRequest
0 голосов
/ 15 апреля 2011
$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();
    }
} 

ожидаемый вывод - добавить 'arrAddResult', добавленный в $ arrResult.Но по какой-то причине итератор get modify, но он не отражает изменения в массиве arrResult.

Я попытался передать массив по ссылке в функции 'traverseStructure', но все еще изо всех сил пытался получить правильный вывод.

Сначала я пытаюсь использовать итератор.Я должен создать ассоциативный массив N-Level как arrResult, поэтому решил использовать итератор.

1 Ответ

0 голосов
/ 15 апреля 2011

Вот пример того, как сделать это с одним массивом.

<?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, чтобы он не копировался на все уровни обхода. Остальное должно быть идентично.

...