Получить подкатегорию и подкатегорию и бесконечную субподкатегорию - PullRequest
0 голосов
/ 03 ноября 2019

Я пытаюсь зациклить функцию, которая берет все подкатегории .. из одной главной категории в одну таблицу и помещает в массив.

Пример таблицы:

ID   | ParentID
1    | 0
2    | 1
3    | 1
4    | 2
5    | 4
6    | 3
7    | 1

(Подкатегории имеютparentID)

Теперь пример в функции PHP, принимающей все подкатегории главной категории (ID = 1)

    var_dump(getSubCategories(1));

    function getSubCategories($parent_id = 0, $subcategories = array())
    {
        global $db;

        $query = $db->query("
SELECT ID 
  FROM categories
 WHERE ParentID = $parent_id 
 ORDER 
    BY Name ASC
");

        while ($row = $query->fetch_assoc()) {
            $subcategories = getSubCategories($row['ID'], $subcategories);
        }
        return $subcategories;
    }

Проблема состоит в том, чтобы поместить идентификаторы в массив, потому что код вышепечатает этот результат:

array(0) { }

Одна вещь, которую я заметил, это то, что, если я добавлю эту строку ниже, в то время как:

echo $row['ID'] . ',';

Она печатает результат правильно, но не как массив:

2,3,4,5,6,7

Мои ожидания были такими, например: array(1, 2, 3, 4, 5, 6, 7) и т. Д., Но не многомерными.

Ответы [ 2 ]

2 голосов
/ 03 ноября 2019

Вы должны передать $subcategories параметр по ссылке

    $subCategories = array();
    getSubCategories(1, $subCategories);
    var_dump($subCategories);
    function getSubCategories(&$subCategories, $parent_id = 0)
    {
        global $db;

        $query = $db->query("
SELECT ID 
  FROM categories
 WHERE ParentID = $parent_id 
 ORDER 
    BY Name ASC
");
        while ($row = $query->fetch_assoc()) {
            getSubCategories($subCategories, $row['ID']);
        }
    }

или просто добавить результаты в переменную $subcategories.

    var_dump(getSubCategories(1));
    function getSubCategories($parent_id = 0)
    {
        global $db;

        $query = $db->query("
SELECT ID 
  FROM categories
 WHERE ParentID = $parent_id 
 ORDER 
    BY Name ASC
");
        $subcategories = array();
        while ($row = $query->fetch_assoc()) {
            $subcategories = array_merge($subcategories, getSubCategories($row['ID']));
        }
        return $subcategories;
    }
1 голос
/ 03 ноября 2019

Ваша проблема в том, что вы продолжаете перезаписывать $subcategories вместо добавления к нему. Также вам необходимо добавить текущее значение $row['ID'] в массив. Вам нужно изменить эту строку:

$subcategories = getSubCategories($row['ID'], $subcategories);

на

$subcategories = array_merge($subcategories, array($row['ID']), getSubCategories($row['ID']);
...