2008-08-25 6 views
19

est-il un moyen facile de parcourir un tableau associatif de cette structure en PHP:itérant sur un complexe Associatif en PHP tableau

Le tableau $searches a un index numéroté, avec entre 4 et 5 parties associatives. Donc, je ne dois pas seulement parcourir $searches[0] à $searches[n], mais aussi $searches[0]["part0"] à $searches[n]["partn"]. La partie difficile est que les différents index ont des nombres différents de parties (certains pourraient manquer un ou deux). Réflexions sur comment le faire d'une manière agréable, soignée et compréhensible?

Répondre

38

Nest deux foreach loops:

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

est $ i et les valeurs d'une variable $ temp copie du tableau associatif ou ils se réfèrent à la référence de tableau réel? –

+1

@ MMAmail.com: Ce code n'utilise pas de références, il utilise des copies. Si vous voulez vraiment utiliser des références (mais vous ne le faites pas habituellement!), Vous devez préfixer les noms des variables avec esperluette, ie '& $ i' et' & $ values' dans leur déclaration, et vous devez "annuler" les variables après la boucle. –

6

Vous devriez être en mesure d'utiliser un imbriquée foreach statment

de la 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

Seulement 2 dimensions, ne fonctionnera pas pour 2+ dimensions –

0

Pouvez-vous en boucle un peu plus de toute la « partie [n] » articles et utilisez isset pour voir si elles existe réellement ou non?

0

Je ne suis vraiment pas sûr de ce que vous voulez dire ici - sûrement une paire de boucles foreach fait ce que vous avez besoin?

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

Ou avez-vous besoin de quelque chose de récursif? Je serais en mesure d'aider plus avec des données d'exemple et un contexte dans la façon dont vous voulez les données retournées.

12

On dirait un bon endroit pour une fonction récursive, esp. si vous avez plus de deux niveaux de profondeur.

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

Je sais qu'il est question nécromancie, mais itérer sur les tableaux multidimensionnels est facile avec Spl itérateurs

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

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

Voir

+0

Que se passe-t-il si l'un des éléments du tableau est un objet itératif? – Petah

+0

@Petah il sera itéré. Voir http://codepad.org/sd8eBvcu – Gordon

+0

savez-vous comment l'exclure de l'itérer?, Donc seuls les tableaux sont itérés? – Petah

0

Tenir compte ce tableau multi dimensionnel, J'espère que cette fonction aidera.

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

} 
Questions connexes