web-dev-qa-db-fra.com

PHP - Accès aux valeurs de tableau multidimensionnel

Après plusieurs heures passées à déconner, à transpirer et à me tirer les cheveux, je ne peux toujours pas accéder à ces valeurs. Je veux parcourir le premier niveau de tableaux, et c'est assez simple avec une boucle 'foreach' de base, mais je n'arrive pas à me rendre au tableau '[' adéquation ']' du second sous-tableau. J'ai jeté un coup d'œil autour de moi, mais je ne peux apparemment rien obtenir d'autre que des tutoriels très basiques sur les tableaux, qui ne semblent pas aller trop loin dans la boucle.

J'essaie d'accéder aux valeurs du tableau imbriqué/sub, c'est-à-dire '[' nom_espèce ']'.

Je ne veux pas utiliser de clés associatives car le tri est un problème.

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Bradeley Hall Pool
            [postcode] => CW1 5QN
            [lat] => 53.10213
            [lon] => -2.41069
            [size] => 1.60
            [pegs] => 21
            [distance] => 26.6
        )

    [1] => Array
        (
            [id] => 2
            [name] => Farm Pool
            [postcode] => CW9 6JQ
            [lat] => 53.320502
            [lon] => -2.549049
            [size] => 0.88
            [pegs] => 8
            [distance] => 15.4
            [suitability] => Array
                (
                    [0] => Array
                        (
                            [fk_water_id] => 2
                            [fk_species_id] => 4
                            [species_name] => Barbel
                            [species_rating] => 1
                            [record_id] => 1
                            [weight_kg] => 2.721554
                            [length_cm] => 40
                            [height_cm] => 30
                        )
                )
       )
)
17
Paul Pavlou

Ce qui vous a probablement dérangé, c’est que la pertinence correspond à un tableau de tableaux et pas uniquement à un tableau. Ainsi, dans un exemple où vous souhaitez obtenir la propriété nom_espèce du premier deuxième élément de niveau supérieur, vous utiliseriez quelque chose comme: 

$array[1]["suitability"][0]["species_name"];

Il est intéressant de noter que votre premier tableau ne contient pas de valeur "convenabilité", de sorte que l'accès ne pourrait pas être effectué. Dans une boucle foreach, vous pouvez utiliser une construction similaire à celle-ci:

foreach($array as $value){
    if (isset($value["suitability"])){
        echo $value["suitability"][0]["species_name"];
    }
}
19
Orangepill

Vous pouvez jeter un oeil sur PHP: classe RecursiveArrayIterator

Cela vous permet d'itérer sur des multiples ArrayIterator imbriqués. Si vous n'utilisez pas ArrayIterator, vous devriez envisager de les essayer.

1
lracicot

La réponse d'Iracicot m'a aidée à trouver le moyen d'accéder aux valeurs d'un tableau récursif à l'aide de la classe RecursiveIterator comme ci-dessous. Ma solution a fini par utiliser la classe encore plus utile RecursiveIteratorIterator selon http://php.net/manual/en/class.recursiveiteriteriterator.php . Veuillez garder à l’esprit le fait très utile que le produit final est un tableau aplati sur lequel j’ai personnellement trouvé beaucoup plus facile de travailler. 

<table style="border:2px;">
  <tr>
    <th>Time</th>
    <th>Service Number</th>
    <th>Destination</th>
  </tr>
<?php 
foreach($stops as $buses){
       $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($buses));
       $bus = (iterator_to_array($iterator,true)); 
       print('<tr><td>'.$bus['AimedDepartureTime'].'</td><td>'.$bus['PublishedLineName'].'</td><td>'.$bus['DirectionName'].'</td></tr>');
}
?>
</table>
1

Pour obtenir la valeur de l'élément imbriqué à partir d'un tableau multidimensionnel avec un repli sur la valeur par défaut, vous pouvez utiliser:

Arr::getNestedElement($array, $keys, $default = null)

de cette bibliothèque comme ceci:

Arr::getNestedElement($array, [$index1, 'suitability', $index2, 'species_name'])

qui renverra null (ou la valeur par défaut spécifiée) au lieu d'avertir si vous essayez d'accéder à des clés qui n'existent pas dans array.

0
Minwork