#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; } ?>
Комментариев нет:
Отправить комментарий