Страницы

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

пятница, 10 января 2020 г.

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

#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; } ?>

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

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