PHP - Accessing Multidimensional Array Values

2019-01-01 14:12发布

问题:

After several hours of messing, sweating and pulling my hair out I\'m still unable to access these values. I want to loop through the first level of arrays, and that\'s simple enough with a basic \'foreach\' loop but I can\'t seem to get to the \'[\'suitability\']\' array on the second sub array. I\'ve looked around but can\'t seem to get anything other than really basic array tutorials which don\'t seem to delve to far into looping.

I\'m trying to access the values in the nested/sub array ie \'[\'Species_name\']\'.

I don\'t want to use associative keys as the sorting is a bit of an issue.

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
                        )
                )
       )
)

回答1:

The thing that is probably tripping you up is that suitability is an array of arrays not just an array so in an example where you want to get the species_name property of the first second top level element you would use something like

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

It\'s worth noting that your first array does not contain a \"suitability\" value so that would not be able to be accessed. In a foreach loop you could use a construct similar to this:

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


回答2:

You may take a look at PHP: RecursiveArrayIterator class

This allow you to iterate over multiples nested ArrayIterator. If you\'re not using any ArrayIterator, then you should consider to try them.



回答3:

Iracicot\'s answer helped me find my way towards accessing the values of a recursive array using the RecursiveIterator class as below. My solution ended up using the even more useful RecursiveIteratorIterator class as per http://php.net/manual/en/class.recursiveiteratoriterator.php. Please bear in the mind the very useful fact that the end product is a flattened array which I personally found much easier to work with.

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


回答4:

For getting nested element value from multidimensional array with fallback to default value you can use:

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

from this library like this:

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

which will return null (or specified default value) instead of warning if you try to access keys that do not exists in array.