Задать вопрос
volkovecgenei
@volkovecgenei
...

Как правильно организовать рекурсивный перебор?

function get_cat_recursive($id_check, $array_check, $array_temp)
{

  foreach ($array_check as $key => $value) {
    
    if ( $id_check == $value['parent_id']) {

      array_push($array_temp, $value['id']);
      get_cat_recursive($value['id'], $array_check, $array_temp);

    }

  }
  return $array_temp;

}

Есть массив
5c6ffb4be133d008361751.jpeg
Этот массив используется для вывода меня и категорий. Товары принадлежат только категориям последнего уровня вложенности, допусти есть полный путь до под категории: Рыбалка -> Удилище -> Болонское удилище, записан для товара будет id категории "Болонское удилище", мне же нужно вывести все товары, которые входят во все подкатегории категории "Рыбалка". Для этого нужно получить id всех подкатегорий входящих в Рыбалку. Я пытаюсь написать рекурсивный перебор, но почему-то он работает только для одного уровня вложенности. Как сделать чтобы при передаче в функцию id категории рыбалки, результатом был бы массив с id всех подкатегорий?
  • Вопрос задан
  • 315 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 1
@artem78
У вас ошибка: когда вы делаете рекурсивный вызов, найденные в нём значения НЕ объединяются с текущими. Вот так должно быть:
$array_temp += get_cat_recursive($value['id'], $array_check, $array_temp);


А лучше передавать массив для результата по ссылке и каждый вызов функции будет добавлять в него то, что он нашёл. Исходный массив тоже желательно по ссылке, чтобы при каждом вызове функции не происходило его копирование в памяти.
function get_cat_recursive($id_check, &$array_check, &$array_temp)
{

  foreach ($array_check as $key => $value) {
    
    if ( $id_check == $value['parent_id']) {

      array_push($array_temp, $value['id']);
      get_cat_recursive($value['id'], $array_check, $array_temp);

    }

  }

}

// Использование
$result = []; // При первом вызове функции передаём пустой массив
get_cat_recursive(2, $all_cats, $result);
print_r($result);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Adamos
@Adamos
У вас не рекурсивная функция. Нужно передавать в нее &$array_temp, раз уж вы его заполняете.
А так каждый рекурсивный вызов работает со своей копией - вхолостую.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Lachestry Таганрог
от 170 000 до 200 000 ₽
SpectrumData Екатеринбург
от 150 000 до 220 000 ₽
15 дек. 2024, в 01:17
10000 руб./за проект
14 дек. 2024, в 23:53
1000 руб./за проект
14 дек. 2024, в 22:57
3000 руб./за проект