【问题标题】:Codeigniter multi-dimensional array return only the first rowCodeigniter 多维数组只返回第一行
【发布时间】:2014-12-14 15:29:09
【问题描述】:

有一天我遇到了这个问题,但我找不到解决方案。 我的目标是从 ID(父亲)返回链接列表。所以我想要他所有的孩子。 但在视图中,我只有结果(第一个......)。

我的控制器中有:

$data['list_link'] = $this->menuManager->list_link();

在我的模型中:

function list_link($fatherid=0){
    $r = array();
    $sSQL = 'SELECT * FROM categories WHERE fatherid = ' . $fatherid . ' AND siteid = ' . MY_SITEID_DEFAULT . ' ORDER BY name';
    $query = $this->db->query($sSQL);
    // stock results in array
    $r[] = $query->result_array();
    foreach ($query->result() as $row) {
        // let's find the childs
        $this->list_link($row->id,$loop);
    }
    return $r;
}

如果我在这里“为每个”$r,一切看起来都不错。 所以,$data['list_link'] 现在应该有所有的行了。

在我看来:

 foreach ($list_link as $link){
   foreach ($link as $row){
      echo $row['name'];
   }
}

但是,我只有第一个链接(第一个孩子),没有另一个。任何帮助都将不胜感激,因为我已经解决了几天这个问题......

【问题讨论】:

    标签: php arrays codeigniter recursion


    【解决方案1】:

    你没有在递归调用中存储任何值(尽管我仍然不确定你会得到你所期望的)。您需要在每个函数调用中填充 $r

    $r[] = $this->list_link($row->id,$loop);
    

    但是,要么我遗漏了什么,要么你把事情复杂化了,但我认为你可以简单地返回结果数组并使用它:

    function list_link($fatherid=0,$loop=0){
        $sSQL = 'SELECT * FROM categories WHERE fatherid = ' . $fatherid . ' AND siteid = ' . MY_SITEID_DEFAULT . ' ORDER BY name';
        $query = $this->db->query($sSQL);
        return $query->result_array();
    }
    

    更新

    你的最新版本仍然没有从递归调用中收集数据,这是完整的功能,看看它是否有效:

    function list_link($fatherid=0){
        $r = array();
        $sSQL = 'SELECT * FROM categories WHERE fatherid = ' . $fatherid . ' AND siteid = ' . MY_SITEID_DEFAULT . ' ORDER BY name';
        $query = $this->db->query($sSQL);
        $result = $query->result_array();
        // stock results in array
        $r[$fatherid] = $result;
        foreach ($result as $row) {
            // let's find the children
            $r[$fatherid][$row['id']] = $this->list_link($row['id']);
        }
        return $r;
    }
    

    请注意,我添加了$r[$fatherid][$row['id']],因此最终结果应该是具有分支结构的数组。如果您不希望这样,请改用$r[]

    【讨论】:

    • 谢谢回答,我必须循环寻找孩子。这就是我使用递归的原因。但是有了新的测试,我才注意到我得到了所有 lvl 1 的孩子。好像递归没有很好地设置或“r”出于任何原因没有一切。也许我没有以好的方式使用数组?
    • 嗯,即使您按照我在答案的第一行代码中向您展示的方式进行操作?尝试var_dumping 结果,看看发生了什么。
    • $r = ...$r[] = ... 不一样。第一个覆盖 $r 的值,而第二个向它推送一个值。我已经用一个完整且优化的示例更新了我的答案。
    • 我了解您的管理方式。我明天试试(这里已经很晚了)。非常感谢您的宝贵时间。
    • 不客气,如果有任何问题,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 2011-11-05
    相关资源
    最近更新 更多