递归地向数组添加值

Recursively add value to an array

我想将子元素 ID 获取到一个数组中。 从我的 table,id 5 是 id (4, 11) 的父级,id 4 是 id 9 的父级。 如果我用 id 5 调用 childCategoryIds() 函数,它应该 return [11, 9, 4],但是 它是 returning [11, 4]。我的函数和 sql 数据如下所示:

Table:

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 return id (11, 4)。但是 var_dump($res->id) 将所有 id (11, 9, 4) 显示到循环中。据我所知,循环 运行 只进入函数一次,或者当函数调用自身进入循环时,它无法将其 id 推送到 $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"
}

我有一些类似的问题,但找不到解决方案。

问题出在作用域上,函数中声明的变量在函数外部看不到(即使递归调用)。如果你转储 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;