Вложенный массив с одним циклом foreach? - PullRequest
2 голосов
/ 13 апреля 2010

Мне нужен доступ к массиву, который выглядит следующим образом.

Array
(
    [0] => Array
        (

            [54] => Array
            (
                [test] => 54
                [tester] => result
            )
         )
)

foreach($array as $key=>$value)
{
  echo $key;// prints 0
  echo $value;// prints Array
  /*
   now i can iterate through $value but i dont want it solve that way example:
  foreach($value as $k=>$v)
  {
    echo $k;//prints test
    echo $v; //prints 54
  }
  */

}

Как можно повторить только один раз? получить значения test и tester ? Я надеюсь, что смогу объяснить свою проблему ясно

Ответы [ 3 ]

4 голосов
/ 13 апреля 2010

Использование SPL * RecursiveDirectoryIterator

$iterator = new RecursiveIteratorIterator(
                new RecursiveArrayIterator($array), 
                RecursiveIteratorIterator::SELF_FIRST);

foreach($iterator as $key => $val) {
    if($key === 'test' || $key === 'tester') {
        echo "$key = $val \n";
    }
}

При этом будут найдены все элементы массива со значением test или tester независимо от того, где они находятся в многомерном массиве. Если вам нужно сузить его до определенной глубины в массиве, вы можете сравнить с $iterator->getDepth().


Вы также можете поместить условие if в тело метода FilterIterator ' accept () , например,

class TestFilter extends FilterIterator
{
    public function accept()
    {
        return ($this->key() === 'test' || $this->key() === 'tester');
    }
}

и затем оберните в него итератор перед foreach его использованием, например,

$iterator = new TestFilter($iterator); // wrap iterator from first example
foreach($iterator as $key => $val) {
    echo "$key = $val \n";    
}

Дополнительное чтение:

1 голос
/ 13 апреля 2010

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

array_walk_recursive($array, create_function('$item, $key', 
    'echo "$key => $item<br />";'
));

Или при использовании PHP 5.3:

array_walk_recursive($array, function($item, $key) { 
    echo "$key => $item<br />";
});

Это будет быстрее (и более читабельным), чем create_function (). Однако эта конструкция доступна только в PHP 5.3 и выше.

Оба будут выводить:

test => 54
tester => result

Это именно то, что вы хотите, я считаю.

0 голосов
/ 13 апреля 2010

Это будет работать только для этого конкретного массива:

foreach($array[0][54] as $key=>$value)
{
    echo $key;// prints test and tester
    echo $value;// prints 54 and result
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...