Страницы

Поиск по вопросам

вторник, 26 февраля 2019 г.

рекурсивный поиск и создание нового массива

Array( 254370, 254363 ), 254363 => Array( 254369 ), 254357 => Array( 254362, 254359 ), 254359 => Array( 254360 ), Array( 254357 ) );
Есть массив, нужно обойти рекурсивно и создать новый, например при выборе ключа 254362, получаем значения 254370, 254363 ищем полученные значения, как ключи вновь и т.д. Новый массив должен иметь структуру, как в примере, но без незатронутых ключей при поиске.
В настоящий момент есть код:
var_dump(get_childs($child_array, $id));
function get_childs($array, $id) { foreach ($array[$id] as $value) { $childs[$id] = $array[$id]; get_childs($array, $value); } return $childs; }
При его исполнении возникает ошибка ERR_CONNECTION_RESET


Ответ

Ваша процедура может зацикливаться на данных в которых 2 id будут указывать друг на друга. В вашем примере таких не видно, но надо учитывать, что в вашем массиве присутствует элемент, отсутствие номера у которого может вводить в заблуждение:
254363 => Array( 254369 ), ... 254359 => Array( 254360 ), Array( 254357 ) <-- Вы думаете это 0й элемент ? НЕТ - это следующий по номеру, за максимальным в вашем массиве Т.е. 254364
А процедура с защитой от циклов и исключением других ошибок, типа отсутствующих элементов массива и не объявленной переменной childs должна выглядеть примерно так:
Array( 254370, 254363 ), 254363 => Array( 254369 ), 254357 => Array( 254362, 254359 ), 254359 => Array( 254360 ), 254369 => Array( 253000 ), Array( 254357 ) );
var_dump(get_childs($arr, 254362));
function get_childs(&$array, $id) { static $childs=[]; static $allkey=[]; if(!array_key_exists($id,$array)) return false; foreach ($array[$id] as $value) { $childs[$id] = $array[$id]; if(!in_array($value,$allkey)) { $allkey[]=$value; get_childs($array, $value); } } return $childs; } ?>

Комментариев нет:

Отправить комментарий