Рекурсивный метод для обхода многомерного массива в PHP - PullRequest
2 голосов
/ 15 июля 2010

Мне нужен метод для обхода многомерного массива в PHP без использования вызовов самой функции.

В основном у меня есть такой массив:

$data = array(
    'hoge' => 123,
    'foo' => 456,
    'bar' => 789,
    'aaa' => array(
        'abc' => 111,
        'bcd' => 222,
        'cde' => 333
    ),
    'bbb' => array(
        'def' => array(
            'efg' => 'hoge'
        )
    ),
    'stacks' => array(
       'a',
       'b'=> array('qwe' => 111, 
                   'asd' => 222, 
                   'args' => array('1', 
                                   '2', 
                                   '3')),
       'c'
    )
);

Обычно вы используете такую ​​функцию, как эта:

    function get_array_elems($arrResult, $where="array"){
      while(list($key,$value)=each($arrResult)){
        if (is_array($value)){
          get_array_elems($value, $where."[$key]");
        }
      } else {
        ...anything
      }
    }


get_array_elems($arrResult);

Я не могу использовать этот метод, потому что мне нужно написать этот метод в функции PHP, и он не может написать функцию в другой функции.

Можно ли это сделать с помощьюитерационный метод, такой как while, foreach, array_walk_recursive и т. д .?

Ответы [ 2 ]

2 голосов
/ 15 июля 2010

array_walk_recursive все еще будет работать.Просто используйте анонимную функцию: http://php.net/manual/en/functions.anonymous.php в качестве обратного вызова.Вы можете использовать анонимные функции внутри других функций, поэтому они должны работать для вас.Просто убедитесь, что вы используете по крайней мере PHP 5.3.0 с тех пор, когда были введены анонимные функции.

1 голос
/ 15 июля 2010

Хотя я также не могу понять, как использование рекурсивной функции было бы невозможно, но как упражнение по программированию это интересно.

Если бы вы имитировали рекурсию, вы должны иметь свой собственный стек, чтобы отслеживать свою позицию на каждом уровне, но это настоящая PITA, поэтому, если все так же, лучше сначала пройти уровень 0, 1 2 и т. Д. В этом порядке и собирайте вложенные массивы по ходу работы. E.g.:

function walk($walk)
{
    while ( count($walk) > 0 )
    {
        $defer = array();
        foreach ( $walk as $k=>$v )
        {   
            if ( is_array($v) )
            {       
                foreach ( $v as $kk=>$vv ) $defer["$k.$kk"] = $vv;
            } else {
                print "$k=>$v\n";
            }       
        }   
        $walk = $defer;
    }
}

но это, очевидно, имеет характеристики, отличные от типичного рекурсивного решения, что может быть или не быть проблемой.

...