Доброго времени суток. Путем несложных манипуляций был получен массив такого типа: Код (Text): Array ( [0] => Array ( [0] => Array ( [a] => 2 ) [1] => Array ( [b] => 1 ) ) [1] => Array ( [0] => Array ( [0] => Array ( [c] => 1 ) [1] => Array ( [d] => 1 ) ) [1] => Array ( [e] => 1 ) ) ) Необходимо получить цепочку ключей для каждого элемента, как вариант: Код (Text): Array ( [a] => 00 [b] => 01 [c] => 100 [d] => 101 [e] => 11 ) Лично я вижу решение, как рекурсивный обход массива и [ если массив ] добавляем в строку индекс, как только упираемся в элемент - добавляем разделитель. Но проблема в том, что после добавления разделителя необходимо удалить родительский массив элемента и начать рекурсию заново. И так до тех пор пока не получим пустой массив. В конце просто заэксплодим строку по разделителю. Не получается удалить родительский массив для найденного элемента и начать рекурсию заново. Думаю, если решить эту проблему, то сделаю сам
Спасибо, но справился немного по другому Получил массив индексов всех элементов на последнем уровне вложенности. Потом рекурсивно искал их в многомерном массиве, с каждым вложенным массивом записывал индекс, если натыкался на элемент - эксепшеном выкидывал себя из рекурсии, если найден другой элемент - удаляем один индекс с конца накопленных, так как мы на другой уровень вложенности в рекурсии переходим. А потом отлавливал исключения для каждого элемента Возможно, костыльно, но тем не менее, работает Я просто не сразу понял, что после foreach в рекурсии можно внести значимый код
Одним из способов является цикл for..each с некоторыми операциями изменения массива: //$input is your original input array // final output array $output = array(); // Loop over the array foreach ($input as $key => $value) { $output[$key]['group_id'] = $value['group_id']; // Set recipients key at the same level as group_id // Access the value at [0]['recipients'] $output[$key]['recipients'] = $value[0]['recipients']; } http://q-answer.ru/questions/kak-udalit-roditel-skiy-massiv-v-php-30394.html
"Цепочка ключей" это похоже на материализованный путь. У тебя только 0 и 1 могут быть ключами? То есть двоичное дерево и никак иначе? Потому что при более чем одном символе в ключе уже напрашивается вставка разделителя между именами, чтобы смысл не исказился.
сделал на анонимных функциях. допущения и тайные знания: - функция array_walk_recursive вызывает лямбду только для конечных элементов (не-массивов) - считаем, что "конечные" ключи уникальны - считаем, что "не конечные" ключи бывают только из одного символа, поэтому не страшно, что не будет разделителя между ними - чтобы рекурсивно обратиться из лямбды к ней же самой, надо передать её по ссылке PHP: <?php $source = [ '0' => [ '0' => [ 'a' => 2, ], '1' => [ 'b' => 1, ], ], '1' => [ '0' => [ '0' => [ 'c' => 1, ], '1' => [ 'd' => 1, ], ], '1' => [ 'e' => 1, ], ] ]; // find end points $keys = []; array_walk_recursive($source, function ($dummy, $key) use (&$keys) { $keys[$key] = null; }); // recusrsion to find paths end end points $func = function ($a, $path) use(&$func, &$keys) { foreach ($a as $k => $v) { if (!is_array($v)) { $keys[$k] = $path; } else { $func($v, $path . $k); } } }; $func($source, ''); // debug output var_export($keys); запускаем: Код (Text): $ php test.php array ( 'a' => '00', 'b' => '01', 'c' => '100', 'd' => '101', 'e' => '11', )
да плевать, Валик. можно подумать свежие посты имеют больше смысла ))) --- Добавлено --- лишь бы ты учился хорошо!