2010-04-13 8 views
2

je dois avoir accès à un tableau qui ressemble à ceci.Tableau imbriqué avec une boucle foreach?

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 
    } 
    */ 

} 

Comment ne pas répéter une seule fois? pour obtenir les valeurs de essai et testeur? J'espère que je pourrais expliquer mon problème clair

+0

Est-ce que le tableau n'a qu'un seul tableau (qui contient plus de tableaux) ou at-il de nombreux tableaux qui contiennent de nombreux tableaux? Vous devez donner un exemple légèrement meilleur pour votre tableau de test. – zaf

+0

Et permettez-vous d'autres fonctions comme array_map etc ...? – zaf

+0

@zaf est un tableau qui contient de nombreux tableaux – streetparade

Répondre

4

Utilisez RecursiveDirectoryIterator de SPL

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

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

Ceci trouvera tous les éléments du tableau avec une valeur de deux essai ou testeur, quel que soit l'endroit où il apparaît dans le tableau multidimensionnel. Si vous devez le réduire à une profondeur spécifique dans le tableau, vous pouvez faire correspondre $iterator->getDepth().


Vous pouvez aussi mettre la condition if dans le corps de la méthode d'une méthode de » accept()FilterIterator, par exemple

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

puis envelopper l'itérateur en avant foreach ing il, par exemple,

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

Pour en savoir plus:

+0

Merci, je vais faire un essai – streetparade

+0

Pour ce que ça vaut, si mon interprétation de la question est correcte que vous voulez juste obtenir les éléments le plus profond (non-tableau) de la tableau, alors la vie pourrait être un peu plus simple en utilisant 'nouveau RecursiveIteratorIterator (nouveau RecursiveArrayIterator (tableau de $))' et ne pas avoir de condition dans la boucle 'foreach'. – salathe

+0

@salathe accordée, si vous prenez l'exemple de l'OP littéralement, alors le LEAVES_ONLY par défaut serait suffisant. – Gordon

0

Cela ne fonctionne que pour ce tableau spécifique:

foreach($array[0][54] as $key=>$value) 
{ 
    echo $key;// prints test and tester 
    echo $value;// prints 54 and result 
} 
+0

Noop ce n'est pas ce dont j'ai besoin il devrait aussi woth pour [120] [2] et bientôt – streetparade

+0

Cette réponse ne devrait pas avoir été rejetée, juste assez c'est trop spécifique, mais la question n'a pas vraiment fourni beaucoup de la manière d'une structure de tableau appropriée, juste un exemple très basique. –

1

Vous pouvez utiliser une fonction anonyme à la liste des articles. Cela utilisera récursion chaque fois qu'un tableau est rencontré comme un élément:

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

ou lorsque vous utilisez PHP 5.3:

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

Ce sera plus rapide (et plus lisible) que create_function(). Cependant, cette construction n'est disponible qu'en PHP 5.3 et plus.

deux Affichera:

test => 54 
tester => result 

Ce qui est exactement ce que vous voulez, je crois.

Questions connexes