2009-11-07 7 views
1

Comment puis-je itarate ce tableauIteration à travers des tableaux dans des tableaux PHP

array(2) { 
    [0]=> 
    array(1) { 
    [0]=> 
    array(14) { 
     [0]=> 
     string(17) "[email protected]" 
     [1]=> 
     string(23) "alokkumar.censored" 
     [2]=> 
     string(24) "[email protected]" 
     [3]=> 
     string(23) "[email protected]" 
     [4]=> 
     string(24) "[email protected]" 
     [5]=> 
     string(17) "[email protected]" 
     [6]=> 
     string(22) "[email protected]" 
     [7]=> 
     string(25) "[email protected]" 
     [8]=> 
     string(21) "[email protected]" 
     [9]=> 
     string(32) "[email protected]" 
     [10]=> 
     string(25) "[email protected]" 
     [11]=> 
     string(28) "[email protected]" 
     [12]=> 
     string(17) "[email protected]" 
     [13]=> 
     string(22) "[email protected]" 
    } 
    } 
    [1]=> 
    array(1) { 
    [0]=> 
    array(14) { 
     [0]=> 
     string(17) "[email protected]" 
     [1]=> 
     string(23) "[email protected]" 
     [2]=> 
     string(24) "[email protected]" 
     [3]=> 
     string(23) "[email protected]" 
     [4]=> 
     string(24) "[email protected]" 
     [5]=> 
     string(17) "[email protected]" 
     [6]=> 
     string(22) "[email protected]" 
     [7]=> 
     string(25) "[email protected]" 
     [8]=> 
     string(21) "[email protected]" 
     [9]=> 
     string(32) "[email protected]" 
     [10]=> 
     string(25) "[email protected]" 
     [11]=> 
     string(28) "[email protected]" 
     [12]=> 
     string(17) "[email protected]" 
     [13]=> 
     string(22) "[email protected]" 
    } 
    } 
} 
+3

mmmmmmm courriels. –

+4

Je serais vraiment en colère si l'un d'eux était mon e-mail ... – gnarf

+0

j'ai ajouté censuré aux adresses – streetparade

Répondre

7

Vous pouvez utiliser un foreach dans un autre foreach:

foreach ($array as $item) { 
    foreach ($item[0] as $email) { 
     // … 
    } 
} 

Notez que je $item[0] au lieu de simplement $item.

Vous pouvez également utiliser une fonction pour aplatir ce tableau multidimensionnel et ireate ensuite avec un seul foreach:

function array_flatten($array) { 
    if (!is_array($array)) { 
     return false; 
    } 
    $result = array(); 
    $stack = $array; 
    $len = count($stack); 
    while ($len) { 
     $val = array_shift($stack); 
     --$len; 
     if (is_array($val)) { 
      foreach ($val as $key => $val) { 
       if (is_array($val)) { 
        array_unshift($stack, $val); 
        ++$len; 
       } else { 
        $result[] = $val; 
       } 
      } 
     } else { 
      $result[] = $val; 
     } 
    } 
    return $result; 
} 
+0

Il y a 2 niveaux d'imbrication, donc cela ne marchera pas. – danieltalsky

+3

@danieltalsky: Notez que j'ai utilisé '$ item [0]'. – Gumbo

+0

noté. Désolé pour ça. il ne me laissera pas changer mon vote ... vous pourriez vouloir éditer et rendre ceci plus clair à l'expéditeur – danieltalsky

0

Eh bien, ce que vous avez ici est un tableau à deux éléments, où chaque élément contient un -element array, qui contient les tableaux que vous voulez parcourir.

// This gets us the two seperate arrays 
foreach ($root_array as $2nd_level_array) { 

    // But now, we still have one more one-element array in each... 
    // we could iterate, but since there's only one element, 
    // we can just grab that element using array_pop() 
    $email_address_array = array_pop($2nd_level_array) 

    // now we can iterate over each of the two lists 
    foreach ($email_address_array as $email_address) { 

    // process email address 

    } 

} 
1

Peut-être un peu plus de solution flexible est récursion:

<?php 

$a = array(); 
$a[] = array(array("a", "b")); 
$a[] = array(array(array("c", "d"), array("e", "f"), array("g", "h"))); 


print_arr($a); 

function print_arr($obj) { 
    foreach($obj as $k => $v) { 
     if(is_array($v)) { 
      print_arr($v); 
     }else{ 
      echo $v ."<br />"; 
     } 
    } 
} 

fait Inutile: ma première fonction récursive qui ne dispose pas d'un arrêt condition, mais un aller condition.

0

La question n'est pas trop spécifique sur la façon d'itérer le tableau, et comme il s'agit d'un tableau multidimensionnel, il existe plusieurs façons de le faire.

Ci-dessous je souligne les deux façons que je vois serait le plus logique pour moi.

Tout d'abord, je parcours le tableau en listant les éléments séquentiellement. Dans ma deuxième tentative, je parcours la table regroupant les éléments de second niveau selon la clé.

$a = array(
    0 => array(
    0 => array(
     0 => "test0-0-0", 
     1 => "test0-0-1" 
    ) 
    ), 
    1 => array(
    0 => array(
     0 => "test1-0-0", 
     1 => "test1-0-1" 
    ) 
    ) 
); 

echo "Method 1\n"; 
foreach ($a as $array) { 
    foreach ($array[0] as $item) { 
    echo "$item\n"; 
    } 
} 
echo "Method 2\n"; 
$a0 = $a[0][0]; 
$a1 = $a[1][0]; 
if (count($a0) == count($a1)) { 
    for ($i=0;$i<count($a0);++$i) { 
    echo $a0[$i]."\n"; 
    echo $a1[$i]."\n"; 
    } 
} 
5

Je voudrais créer une fonction et passer dans array_walk_recursive

function spam_someone($value, $key) 
{ 
    $email=$value; 
    send_evil_spam($email); 
} 

array_walk_recursive($people_to_spam, 'spam_someone'); 

Alternativement, vous pouvez utiliser un RecursiveIteratorIterator pour itérer séquentiellement sur une RecursiveArrayIterator. Ils sont mal documentés, mais je crois que le code ressemblerait à ceci:

//iterate over the array using recursion as in les' answer (doesn't gain much) 
$array_iter=new RecursiveArrayIterator($people_to_spam); 

//Ahh, here we go, this will let us iterate over the leaves in a sequential manner 
$iter_iter=new RecursiveIteratorIterator($array_iter); 
foreach($iter_iter as $email) 
{ 
    send_evil_spam($email) 
} 

Je trouve que ces deux solutions soient les plus propres et plus lisible. Si le tableau ne doit jamais être profond de 3 niveaux, je pourrais juste le coder en dur. Si je ne connaissais pas l'un ou l'autre, j'écrirais ma propre fonction récursive pour le faire (comme dans la réponse).

+0

upvote pour les noms de fonction!:) – mkgrunder

+0

cool merci, pls enlever la merde de spam, je ne suis pas l'un d'entre eux – streetparade