PHP - Доступ к значениям многомерных массивов

После нескольких часов беспорядка, потливости и вытягивания волос я все еще не могу получить доступ к этим ценностям. Я хочу пропустить первый уровень массивов и достаточно простой с базовым циклом "foreach", но я не могу добраться до массива '[' пригодности ']' во втором вспомогательном массиве. Я огляделся, но, похоже, не мог получить ничего, кроме действительно простых обучающих материалов, которые, похоже, не вникают в цикл.

Я пытаюсь получить доступ к значениям в вложенном/подмножестве, т.е. '[' Species_name ']'.

Я не хочу использовать ассоциативные ключи, поскольку сортировка - это немного проблема.

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

Вещь, которая, вероятно, отключает вас, заключается в том, что пригодность представляет собой массив массивов, а не только массив, поэтому в примере, где вы хотите получить свойство species_name первого второго элемента верхнего уровня, вы будете использовать что-то вроде

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

Стоит отметить, что ваш первый массив не содержит значения "пригодности", поэтому доступ к ним невозможен. В цикле foreach вы можете использовать конструкцию, подобную этой:

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

Ответ 2

Вы можете взглянуть на PHP: класс RecursiveArrayIterator

Это позволяет вам перебирать многократные вложенные ArrayIterator. Если вы не используете ArrayIterator, вам следует попробовать попробовать их.

Ответ 3

Ответ Iracicot помог мне найти способ доступа к значениям рекурсивного массива с использованием класса RecursiveIterator, как показано ниже. Мое решение закончилось тем, что использовало еще более полезный класс RecursiveIteratorIterator по http://php.net/manual/en/class.recursiveiteratoriterator.php. Пожалуйста, примите в виду очень полезный факт, что конечный продукт представляет собой сплющенный массив, с которым мне лично легче работать.

<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

Для получения значения вложенного элемента из многомерного массива (с необязательным отступлением к значению по умолчанию) вы можете использовать метод get из этой библиотеки массивов:

Arr::get($array, "$index1.suitability.$index2.species_name")

// Or using array of keys
Arr::get($array, [$index1, 'suitability', $index2, 'species_name'])