Здравствуйте! Имеется массив Код (Text): array(1) { ["Группа"]=> array(3) { [0]=> array(5) { ["Ид"]=> string(36) "e9f69781-9de1-4610-9ddb-8e81779832cb" ["НомерВерсии"]=> string(12) "AAAAAQAAAAI=" ["ПометкаУдаления"]=> string(5) "false" ["Наименование"]=> string(35) "Взрослая коллекция" ["Группы"]=> array(1) { ["Группа"]=> array(3) { [0]=> array(4) { ["Ид"]=> string(36) "054a4c71-ce5a-48c2-89b0-e5e7671a2b30" ["НомерВерсии"]=> string(12) "AAAAAQAAAAQ=" ["ПометкаУдаления"]=> string(5) "false" ["Наименование"]=> string(18) "Демисезон" } [1]=> array(4) { ["Ид"]=> string(36) "4cc716d5-e445-4818-8b6e-3d2ff8e777a9" ["НомерВерсии"]=> string(12) "AAAAAQAAAAU=" ["ПометкаУдаления"]=> string(5) "false" ["Наименование"]=> string(8) "Зима" } [2]=> array(4) { ["Ид"]=> string(36) "f16031ef-f81f-4c75-9753-23fdac46c8d3" ["НомерВерсии"]=> string(12) "AAAAAQAAAAM=" ["ПометкаУдаления"]=> string(5) "false" ["Наименование"]=> string(8) "Лето" } } } } [1]=> array(5) { ["Ид"]=> string(36) "1b291b7a-53dc-4f73-a76e-de1db754e3e4" ["НомерВерсии"]=> string(12) "AAAAAQAAAAY=" ["ПометкаУдаления"]=> string(5) "false" ["Наименование"]=> string(33) "Детская коллекция" ["Группы"]=> array(1) { ["Группа"]=> array(2) { [0]=> array(4) { ["Ид"]=> string(36) "ca7f3385-3452-468f-b587-314c7c211f6d" ["НомерВерсии"]=> string(12) "AAAAAQAAAAg=" ["ПометкаУдаления"]=> string(5) "false" ["Наименование"]=> string(18) "Демисезон" } [1]=> array(4) { ["Ид"]=> string(36) "071d5e60-f256-4581-9b43-a386f1a42c96" ["НомерВерсии"]=> string(12) "AAAAAQAAAAc=" ["ПометкаУдаления"]=> string(5) "false" ["Наименование"]=> string(8) "Лето" } } } } [2]=> array(5) { ["Ид"]=> string(36) "81868932-dc49-4d02-8e58-0d233eaa3401" ["НомерВерсии"]=> string(12) "AAAAAQAAAAk=" ["ПометкаУдаления"]=> string(5) "false" ["Наименование"]=> string(20) "Распродажи" ["Группы"]=> array(1) { ["Группа"]=> array(2) { [0]=> array(4) { ["Ид"]=> string(36) "13e6e290-f603-4819-a1c3-bf51ed1f7c20" ["НомерВерсии"]=> string(12) "AAAAAQAAAAo=" ["ПометкаУдаления"]=> string(5) "false" ["Наименование"]=> string(15) "Все по 350" } [1]=> array(4) { ["Ид"]=> string(36) "5bef86ce-cecd-4f88-9313-5d5aa1aad32c" ["НомерВерсии"]=> string(12) "AAAAAQAAAAs=" ["ПометкаУдаления"]=> string(5) "false" ["Наименование"]=> string(15) "Все по 550" } } } } } } нужно обойти рекурсивно и взять значения "ид" и "наименование". Сам процесс обхода реализую функцией Код (Text): getGroupsRecursive($arrGroupsInXml) { foreach ($arrGroupsInXml as $item) { if (is_array($item)) { getGroupsRecursive($item); } else { echo $item."<br>"; } } } получаю результат: e9f69781-9de1-4610-9ddb-8e81779832cb AAAAAQAAAAI= false Взрослая коллекция 054a4c71-ce5a-48c2-89b0-e5e7671a2b30 AAAAAQAAAAQ= false Демисезон 4cc716d5-e445-4818-8b6e-3d2ff8e777a9 AAAAAQAAAAU= false Зима f16031ef-f81f-4c75-9753-23fdac46c8d3 AAAAAQAAAAM= false Лето 1b291b7a-53dc-4f73-a76e-de1db754e3e4 AAAAAQAAAAY= false Детская коллекция ca7f3385-3452-468f-b587-314c7c211f6d AAAAAQAAAAg= false Демисезон 071d5e60-f256-4581-9b43-a386f1a42c96 AAAAAQAAAAc= false Лето 81868932-dc49-4d02-8e58-0d233eaa3401 AAAAAQAAAAk= false Распродажи 13e6e290-f603-4819-a1c3-bf51ed1f7c20 AAAAAQAAAAo= false Все по 350 5bef86ce-cecd-4f88-9313-5d5aa1aad32c AAAAAQAAAAs= false Все по 550 Подскажите как это всё можно вернуть через return?
ну рекурсия как раз и состоит в том, чтобы это всё вернуть разом, скопив через все рекурсивные вызовы. может тебе лучше это в разделе разовой платной работы разместить?
Да мне самому разобраться хочется... Тем более что вы пишете "вернуть", хочется вернуть, не в браузер распечатать, а переменой, массивом и т.д. понять как. А через буферизацию, с точки зрения не "кривого кода" можно реализовать? Как реализовать я знаю, я имею ввиду именно именно с точки зрения правильности. --- Добавлено --- Или лучше через глобальную переменную.
Добавь вторым параметром ссылку на выходной массив и передавай его во всех рекурсивных вызовов, в нём и накапливай
Большое вам спасибо! Вариант со ссылкой отлично работает, всё собирает и потом ретурном замечательно передаёт во внешнюю функцию.
Ещё можно было бы записывать результат в переменную внутри функции и по выходу из рекурсии её возвращать.
к сожалению просто в переменную/массив и т.д. не получается, записывается только верхний уровень, вложенные затираются (
со строками не очень удобно, нужно потом в массив их переделывать, лишний код, а статичексое связывание пробывал, так же работает. В любом случае всем спасибо, очень быстро и верно направили. А то иногда ступор в решении какой-то задачи приходит и не видишь перед собой очивидных решений.
Да ладно пацаны вы чё, серьезно что ли PHP: <?php function getKeyVals($arr, $key) { foreach ($arr as $k => $v) { if ($k === $key) { yield $v; } else if (is_array($v)) { foreach (getKeyVals($v, $key) as $v2) { yield $v2; } } } } $data = [ [ 'name' => 'A', 'value' => 1 ], [ 'name' => 'B', 'value' => 2 ], [ 'name' => 'C', 'value' => [ 'name' => 'X1', 'value' => 3 ], [ 'name' => 'X2', 'value' => 4 ], ] ]; foreach (getKeyVals($data, 'name') as $r) { var_dump($r); } Код (Text): string(1) "A" string(1) "B" string(1) "C" string(2) "X1" string(2) "X2" Генераторы с нами с 5.5.0. https://php.ru/forum/threads/generatory-yield.53547/
or Код (Text): private function array_filter_recursive (array $array, callable $callback) { foreach ($array as $k => $v) { if (!$array[$k] = (is_array($v) ? $this->array_filter_recursive($v, $callback) : ($callback($v, $k) ? $v : false))) unset($array[$k]); } return $array; } $outputs = $this->array_filter_recursive($inputs, function ($v, $k) { return ($k == 'id' || $k === 'name'); });
static PHP: function getGroupsRecursive($arrGroupsInXml) { static $result = []; foreach ($arrGroupsInXml as $item) { if (is_array($item)) { getGroupsRecursive($item); } else { $result[] = $item; } } return $result; }
@villiwalla Не лучшая идея, потому что при повторном вызове будет уже наполненный ваш $result старыми значениями. Мне, в последнее время, нравится делать такие вещи так: PHP: function getGroupsRecursive($arrGroupsInXml){ $result = []; $recScan = function ($items) use (&$recScan, &$result) { foreach ($items as $item) { if (is_array($item)) { $recScan($item); } else { $result[] = $item; } } }; $recScan($arrGroupsInXml); return $result; } Не вникал в смысл функции