Intereting Posts

Доступ к многомерному элементу массива без знающих родительских элементов

У меня есть функция, которая возвращает следующий многомерный массив. Я не контролирую, как формируется массив. Я пытаюсь получить доступ к элементам «Результат». Эта проблема заключается в том, что имя родительских элементов постоянно меняется. Расположение элемента «Результат» всегда одно и то же (как имя «Результат»). Возможно ли получить доступ к этому элементу без указания имени родительских элементов?

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