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