Рекурсивно добавить значение в массив - PullRequest
0 голосов
/ 28 октября 2019

Я хочу получить идентификаторы дочерних элементов в массив. Из моей таблицы идентификатор 5 является родителем идентификатора (4, 11), а идентификатор 4 является родителем идентификатора 9. Если я вызываю childCategoryIds () функцию с идентификатором 5, этодолжен вернуть [11, 9, 4], но он возвращается [11, 4]. Моя функция и данные sql выглядят следующим образом:

Таблица:

id  parent_id   name        
4   5           Cat Four    
5   1           Cat Five    
9   4           Cat Nine
11  5           Cat Eleven  

моя функция:

function childCategoryIds($id){
    $ci = & get_instance();
    $ci->load->database();

    $child_category_ids = array();

    $ci->db->where('parent_id', $id)->order_by('id', 'DESC');
    $query = $ci->db->get('categories');
    $result = $query->result();
    foreach ($result as $res):
        childCategoryIds($res->id);
        $child_category_ids[] = $res->id;
     // var_dump($res->id);
    endforeach;

    return $child_category_ids;
}

Я получил вызов этой функции из моего контроллера.

childCategoryIds(5);    /* here id = 5 */

Из функции $ child_category_ids вернуть идентификатор (11, 4). но var_dump ($ res-> id) показывает все идентификаторы (11, 9, 4) в цикле. Как я понимаю, цикл запускается только один раз в функцию или когда функция сама вызывает цикл, она не может выдвинуть свой идентификатор в $ child_category_ids .

Я получил следующий результат изэта функция.

array(2) {
    [0] => string(2) "11" 
    [1] => string(1) "4"
}

но мой ожидаемый результат:

array(2) {
    [0] => string(2) "11" 
    [1] => string(1) "9"
    [2] => string(1) "4"
}

У меня есть несколько похожих вопросов, но я не могу найти решение.

1 Ответ

1 голос
/ 28 октября 2019

Проблема в том, что переменные, объявленные в вашей функции, не видны за ее пределами (даже если они вызываются рекурсивно). если вы выгрузите childCategoryIds($res->id);, вы, вероятно, увидите информацию, если ее получите, просто не сохраните ее в массиве.

вы можете попробовать что-то вроде array_merge, чтобы вытащить данные в тот же массив, или простоПросмотрите результаты и добавьте их следующим образом:

$result = $query->result();
foreach ($result as $res):

    $children = childCategoryIds($res->id);
    $child_category_ids = array_merge($child_category_ids, $children);

    $child_category_ids[] = $res->id;
    // var_dump($res->id);
endforeach;

или

$result = $query->result();
foreach ($result as $res):

    $children = childCategoryIds($res->id);
    foreach ($children as $child) {
        $child_category_ids [] = $child;
    }

    $child_category_ids[] = $res->id;
    // var_dump($res->id);
endforeach;
...