2008-08-25 9 views
19

Gibt es eine einfache Art und Weise eine assoziative Array dieser Struktur in PHP iterieren:Iterieren über eine komplexe Assoziative Array in PHP

Das Array hat einen numerierte $searches Index, mit zwischen 4 und 5 assoziativen Teilen. Also muss ich nicht nur über $searches[0] bis $searches[n], sondern auch $searches[0]["part0"] bis $searches[n]["partn"] iterieren. Der schwierige Teil ist, dass verschiedene Indizes eine unterschiedliche Anzahl von Teilen haben (einige können ein oder zwei fehlen).

Denken Sie daran, dies auf eine Weise zu tun, die nett, ordentlich und verständlich ist?

Antwort

38

Nest zwei foreach loops:

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

i $ und eine Kopie Temp $ Werte Variable aus dem assoziativen Array oder beziehen sie auf die tatsächliche Array-Referenz? –

+1

@ MMAmail.com: Dieser Code verwendet keine Referenzen, es verwendet Kopien. Wenn Sie wirklich Verweise verwenden wollen (aber normalerweise nicht!), Müssen Sie den Variablennamen ein kaufmännisches Und voranstellen, dh '& $ i' und' & $ values' in ihrer Deklaration, und Sie sollten die Variablen danach 'unscharf' setzen die Schleife. –

6

Sie sollten eine verschachtelte foreach statment

vom 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

Nur 2 Dimensionen, nicht funktioniert für 2+ Dimensionen –

0

nutzen können Können Sie nur eine Schleife über alle „Teil [n]“ Elemente und die Verwendung isset, um zu sehen, ob sie existieren oder nicht?

0

Ich bin wirklich nicht sicher, was Sie hier bedeuten - sicherlich ein Paar von foreach-Schleife ist, was Sie brauchen?

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

Oder benötigen Sie etwas rekursiv? Ich wäre in der Lage, mehr mit Beispieldaten und einem Kontext zu helfen, wie die Daten zurückgegeben werden sollen.

12

Sieht aus wie ein guter Platz für eine rekursive Funktion, esp. wenn Sie mehr als zwei Tiefenstufen haben.

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

Ich weiß, es Frage Nekromantie ist, aber über Mehrdimensionale Arrays iterieren ist einfach, mit Spl Iteratoren

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

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

Siehe

+0

Was passiert, wenn eines der Array-Elemente ein iteratives Objekt ist? – Petah

+0

@Petah wird es iteriert werden. Siehe http://codepad.org/sd8eBvcu – Gordon

+0

Wissen Sie, wie man es von der Iteration ausschließt ?, so dass nur Arrays iteriert werden? – Petah

0

dieses Multi dimentional Array Betrachten, Ich hoffe, dass diese Funktion hilft.

$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 
    } 

}