Получить массив с ID дочерних категорий

250
19 октября 2017, 11:31

Есть список категорий и их подкатегорий:

Компьютеры
- Ноутбуки
-- БУ ноуты
- Неттопы
-- БУ Неттопы
Комплектующие для компьютеров
- Процессоры
- Материнские платы

Мне необходимо получить id всех подкатегорий в виде массива из категории "Компьютеры".

Входные данные:

$rsCategories = Array
(
    [0] => Array
        (
            [id] => 1
            [parent_id] => 0
            [name] => Компьютеры
        )
    [1] => Array
        (
            [id] => 2
            [parent_id] => 1
            [name] => Ноутбуки
        )
    [2] => Array
        (
            [id] => 7
            [parent_id] => 2
            [name] => БУ ноутбуки
        )
    [3] => Array
        (
            [id] => 3
            [parent_id] => 1
            [name] => Неттопы
        )
    [4] => Array
        (
            [id] => 8
            [parent_id] => 3
            [name] => БУ Неттопы
        )
    [5] => Array
        (
            [id] => 4
            [parent_id] => 0
            [position] => 0
            [name] => Комплектующие для компьютеров
        )
    [6] => Array
        (
            [id] => 5
            [parent_id] => 4
            [name] => Процессоры
        )
    [7] => Array
        (
            [id] => 6
            [parent_id] => 4
            [name] => Материнские платы
        )
)

Сама функция:

function getIdAllChildrenByParent($catId, $rsCategories) {
    // создаём массив для хранения айдишников дочерних категорий
    $arrIdChildCats = array();
    // сохраняем айдишники дочерних категорий в массив
    foreach($rsCategories as $value) {
        if($value['parent_id'] == $catId) {
            $arrIdChildCats[] = $value['id'];
        }
    }
    // найденные айдишники записываем в строку и проходимся 
    // по каждому из них нашей функцией, чтобы найти ещё дочерние категории
    foreach($arrIdChildCats as $value) {
        $result .= "{$value}, ";
        $result .= getIdAllChildrenByParent($value, $rsCategories);
    }
    return $result;
}

Вызов функции:

// передаём айди запрошенной категории и массив содержаший все категории
getIdAllChildrenByParent($catId, $rsCategories);

Получаю результат в виде строки "2, 7, 3, 8, ".

Мозгов хватило решить задачу только так, а как получить результат в виде такого массива?

$result = Array
(
    [0] => 2
    [1] => 3
    [2] => 7
    [3] => 8
)
Answer 1

Вместо того, чтобы собирать все в одну строку собирайте в массив и возвращайте его

// найденные айдишники записываем в строку и проходимся 
// по каждому из них нашей функцией, чтобы найти ещё дочерние категории
$result = array();
foreach($arrIdChildCats as $value) {
    $result[] = $value;
    $result = array_merge(
        $result,
        getIdAllChildrenByParent($value, $rsCategories)
    );
}
return $result;
READ ALSO
CreateProcess вылетает при передаче команды длинной более 63 символов

CreateProcess вылетает при передаче команды длинной более 63 символов

Такой код работает и создаёт задачу, но стоит мне увеличить длину строки text, к примеру вместо /tn abc написать /tn abcd, программа вылетает на функции...

271
Посимвольно считывание с консоли С++ [дубликат]

Посимвольно считывание с консоли С++ [дубликат]

На данный вопрос уже ответили:

410
QTableWidget Drag&Drop cell

QTableWidget Drag&Drop cell

Как в переопределенном методе "dropEvent" определить в какую ячейку перетаскивается объект, так же необходимо знать из какой ячейки этот объект...

371
“Русский” unicode в консоли [дубликат]

“Русский” unicode в консоли [дубликат]

На данный вопрос уже ответили:

336