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