将未知数量的数据库字段预先添加到数组中

时间:2014-06-18 23:22:22

标签: arrays codeigniter

我有一个具有以下结构的数据库

user_id | cat_name | cat_slug | parent_id
-------------------------------------------
Tools   | tools    |     0    |
2       |Chainsaws |chainsaws |     1


我的最终目标是基本上有一个数组,其中包含显示类别路径的各种痕迹路径,它可以包含从父母到5级别的父母的任何地方。

我能够得到我想要的东西......一路上有一些错误。我一直收到Trying to get property of non-object错误。通过我所有其他返回值的尝试都失败了。

我的解决方案在错误下输出我的(半期望的)效果,以及其他类别中断(用“>”表示)。我只是希望有人可以帮我清理它,因为我已经处于一个突破点,经过几个小时没有解决方案。

模型

function get_parent_trail($parent_id){



    if ( $parent_id != 0 && $parent_id){

        $parent_trail = array();

        for( $i = 1; $i <= 4; $i ++ ) {


            $this -> db -> select ( '*' );
            $this -> db -> from ( 'categories' );
            $this -> db -> where ( 'cat_id' , $parent_id );
            $query = $this -> db -> get() -> row();

            array_unshift( $parent_trail, $query->cat_name ) ;

            $parent_id = $query->parents;

        }

        foreach( $parent_trail as $ti ) {
            if ( $ti ) {
                echo "<strong>" . $ti . "</strong> > ";
            }
        }

    } else {

        echo "<span style='color:red;'>No Parent Category</span>";

    }

}



查看

    <table class='admin_table'>
        <thead>
       <th>ID</th>
       <th>Name</th>
       <th>Parent</th>
   </thead>
   <tbody>
   <?php
       foreach($cats as $cat){
        echo "<tr>";
           echo "<td>" . $cat['cat_id'] . "</td>";
           echo "<td>" . $cat['cat_name'] . "</td>";
           echo "<td>";
           $this -> categories -> get_parent_trail( $cat['parents'] );
           echo "</td>";
        echo "</tr>";
       }
        ?>
    </tbody>    
</table>

注意: for循环中的'4'不需要是动态的,因为我已经设置了最多5个类别的硬限制,尽管没有必要进入子类别。

我还有一个额外的“&gt;”在我的列表末尾,我需要摆脱,我知道我的方式不起作用的原因,它只是我能找到的最接近的解决方案。

最终结果

基本上,我希望我的最终结果看起来像;

有2个'级别'的父类别

id | name                |      slug             |        Parent(s)
-----------------------------------------------------------------------
1  | Electric Chainsaws  |   electric-chainsaws  |   Tools > Chainsaws

2 个答案:

答案 0 :(得分:0)

您想要做的是构建递归函数。 例如:

function factorial($number) 
{ 
    if ($number < 2) 
    { 
        return 1; 
    } 
    else 
    { 
        return ($number * factorial($number-1)); 
    } 
}

答案 1 :(得分:0)

经过多次拔毛和几瓶非常浓郁的朗姆酒之后,我终于明白了这一点。我还是比较新手使用codeigniter,所以我的解决方案可能有一些不必要的步骤,但我觉得有必要分享我学到的东西。这是我的整个功能。

function get_parent_trail($parent_id){

    if ( $parent_id != 0 && $parent_id){

        $parent_trail = array();
        $inc = 0;

        for( $i = 1; $i <= 4; $i ++ ) {

            if ( $parent_id != 0 && $parent_id){
                $this -> db -> select ( '*' );
                $this -> db -> from ( 'categories' );
                $this -> db -> where ( 'cat_id' , $parent_id );
                $query = $this -> db -> get();
                $row = $query -> row_array();

                array_unshift( $parent_trail, $row['cat_name'] ) ;

                $parent_id = $row['parents'];
            } else {
                $inc++;
            }

        }

        $popOff = array_pop($parent_trail);

        if ($inc > 2 ){
            echo "<span style='color:red;'>No Parent Category</span>";
        }


        $string  = '';
        foreach( $parent_trail as $ti ) {
            if ( $ti ) {
                $string .=  $ti.' > ';
            }
        }

        (string) $test = substr($string, 0, -2);
        echo $test;

    } else {

        echo "<span style='color:red;'>No Parent Category</span>";

    }

}