2008-08-25 1 views
19

Есть простой способ перебрать ассоциативный массив этой структуры в PHP:Итерация над комплексным ассоциативным массивом в PHP

Массив $searches имеет нумерованный индекс, с между 4 и 5 ассоциативными частями. Поэтому мне нужно не только перебирать $searches[0] через $searches[n], но и $searches[0]["part0"] через $searches[n]["partn"]. Трудная часть состоит в том, что разные индексы имеют разное количество частей (некоторые могут отсутствовать один или два).

Мысли о том, как это сделать, это хорошо, аккуратно и понятно?

ответ

38

Гнездо два foreach loops:

foreach ($array as $i => $values) { 
    print "$i {\n"; 
    foreach ($values as $key => $value) { 
     print " $key => $value\n"; 
    } 
    print "}\n"; 
} 
+0

составляет $ я и $ значения переменного временной копии из ассоциативного массива или же они относятся к фактической ссылке на массив? – 2010-05-18 09:52:09

+1

@ MMAmail.com: Этот код не использует ссылки, он использует копии. Если вы действительно хотите использовать ссылки (но вы, как правило, этого не делаете!), Вы должны префикс имен переменных с амперсандом, то есть `& $ i` и` & $ values` в своем объявлении, и вы должны «отменить» переменные после петля. – 2010-05-18 10:17:45

6

Вы должны быть в состоянии использовать вложенную Еогеасп Постулаты

из php manual

/* foreach example 4: multi-dimensional arrays */ 
$a = array(); 
$a[0][0] = "a"; 
$a[0][1] = "b"; 
$a[1][0] = "y"; 
$a[1][1] = "z"; 

foreach ($a as $v1) { 
    foreach ($v1 as $v2) { 
     echo "$v2\n"; 
    } 
} 
+2

только 2 размеров, не будет работать для 2+ размеров – 2013-04-26 15:55:02

0

Вы можете просто перебираем все «части [п]» пунктов и использование Исеть, чтобы увидеть, если они на самом деле существуют или нет?

0

Я действительно не знаю, что вы имеете в виду здесь - конечно, пара петель Foreach делает то, что вам нужно?

foreach($array as $id => $assoc) 
{ 
    foreach($assoc as $part => $data) 
    { 
     // code 
    } 
} 

Или вам нужно что-то рекурсивное? Я бы мог больше помочь с примерами данных и контекстом в том, как вы хотите вернуть данные.

12

Выглядит как хорошее место для рекурсивной функции, особенно. если у вас будет более двух уровней глубины.

function doSomething(&$complex_array) 
{ 
    foreach ($complex_array as $n => $v) 
    { 
     if (is_array($v)) 
      doSomething($v); 
     else 
      do whatever you want to do with a single node 
    } 
} 
37

Я знаю, что это вопрос некромантия, но итерация многомерных массивов легко с Spl итераторы

$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array)); 

foreach($iterator as $key=>$value) { 
    echo $key.' -- '.$value.'<br />'; 
} 

См

0

Рассмотрим нескольких мерного массива, Надеюсь, эта функция поможет.

$n = array('customer' => array('address' => 'Kenmore street', 
       'phone' => '121223'), 
     'consumer' => 'wellington consumer', 
     'employee' => array('name' => array('fname' => 'finau', 'lname' => 'kaufusi'), 
        'age' => 32, 
       'nationality' => 'Tonga') 
    ); 



iterator($n); 

function iterator($arr){ 

    foreach($arr as $key => $val){ 

    if(is_array($val))iterator($val); 

    echo '<p>key: '.$key.' | value: '.$val.'</p>'; 

    //filter the $key and $val here and do what you want 
    } 

}