У меня есть функция, которая возвращает следующий многомерный массив. Я не контролирую, как формируется массив. Я пытаюсь получить доступ к элементам «Результат». Эта проблема заключается в том, что имя родительских элементов постоянно меняется. Расположение элемента «Результат» всегда одно и то же (как имя «Результат»). Возможно ли получить доступ к этому элементу без указания имени родительских элементов?
Array ( [sHeader] => Array ( [aAction] => ActionHere ) [sBody] => Array ( [CreatePropertyResponse] => Array ( [CreatePropertyResult] => Array ( [Message] => Successfully completed the operation [Result] => 0 [TransactionDate] => 2013-05-19T21:54:35.765625Z [bPropertyId] => 103 ) ) )
)
Легкий выбор для поиска ключей / значений массива рекурсивно – это использование рекурсивного итератора; это встроенные классы, входящие в стандартную библиотеку PHP .
$result = false; $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array)); foreach ($iterator as $key => $value) { if ($key === 'Result') { $result = $value; break; } } var_dump($result);
Бонус здесь заключается в том, что вы могли бы, если хотите, проверить глубину элемента Result
( $iterator->getDepth()
) в структуре массива и / или проверить один или несколько ключей предка ( $iterator->getSubIterator(…)->key()
).
Если родительские элементы имеют только одно дочернее устройство, вы можете решить его, получив единственный элемент, возвращаемый array_keys()
, и переходите на два уровня вглубь.
В любом случае, если ваш массив сильно изменится, и вам систематически нужно получить доступ к вложенному свойству, у вас есть проблема с дизайном.
Изменить: array_column на самом деле не работает в этом случае. Вы можете искать каждый уровень, рекурсивно, пока не найдете данный ключ. Что-то вроде:
function find_key_value($array, $search_key) { if (isset($array[$search_key])) return $array[$search_key]; $found = false; foreach ($array as $key=>$value) { if (is_array($value)) $found = find_key_value($value, $search_key); if ($found) return $found; } return false; }
function findkeyval($arr,$key) { if(isset($arr[$key])) { return $arr[$key]; }else { foreach($arr as $a) { if(is_array($a)) { $val=findkeyval($a,$key); if($val) { return $val; } } } } }