#php
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
Ответы
Ответ 1
Ваша процедура может зацикливаться на данных в которых 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; } ?>
Комментариев нет:
Отправить комментарий