从id_parent表中获取简单的递归

时间:2017-12-07 15:50:24

标签: php codeigniter recursion

我想我的大脑开始变慢,但我希望从这张表中得到一个递归的结果数组:

|id|int(11)|
|name|varchar(150)|
|type|tinyint(4)|
|id_parent|mediumint(9)|

|1|Marque forte|1|0|
|2|Communication|2|1|
|3|Respect du CI|0|2|
|4|Stratégie digitale|0|2
|5|Expérience de marque|2|1|
|6|Gastronomie|0|5|

我想要一个像:

这样的数组
array('id' => array('name' => $name, 'childs' => array( ... ), 'id' => ...)

我只想在一个数组中订购我的数据集。

到目前为止我试过这个:

// returns array of objects - codeigniter result
$dbResult = $this->db->get_where('table')->result();

// will contains the array
$this->data['tree'] = array();
$this->getRecursive(0, 0, $dbResult);
....

private function getRecursive($parent, $niveau, $result)
{
    foreach ($result AS $row)
    {
        if ($parent == $row->id_parent)
        {
            $this->data['tree'][] = array($row->name => $this->getRecursive($row->id, ($niveau + 1), $result));
        }
    }
}

这给了我奇怪的结果......

2 个答案:

答案 0 :(得分:1)

请试试这个。我已经使用$source数组进行测试。由于我没有从实际数据库中获取结果集,因此您必须进行一些更改才能使用您的代码进行调整(例如,将$row['id_parent']更改为$row->id_parent,依此类推)。但是,从概念上讲它应该可行。

<?php
        $source = [
                ['name' => 'A', 'id' => 1, 'id_parent' => 0],
                ['name' => 'B', 'id' => 2, 'id_parent' => 1],
                ['name' => 'C', 'id' => 3, 'id_parent' => 1],
                ['name' => 'D', 'id' => 4, 'id_parent' => 2],
                ['name' => 'E', 'id' => 5, 'id_parent' => 3],
                ['name' => 'F', 'id' => 5, 'id_parent' => 0],
        ];


        function getRecursive($source, $parent) {
            $result = [];
            foreach ($source as $row) {
                if ($parent == $row['id_parent']) {
                    $result[] = [
                                'id' => $row['id'],
                                'name' => $row['name'],
                                'childs' => getRecursive($source, $row['id'] )
                            ];
                        }
                }
                return $result;
        }

        print_r(getRecursive($source, 0));

答案 1 :(得分:0)

你不需要这里的递归 - 以下应该做的工作

$arrTreeById = [];
//$arrData = $this->db->get_where('table')->result_array();

$arrData = [
    [
        'id' => 1,
        'name' => 'Marque forte',
        'type' => 2,
        'id_parent' => 0
    ],
    [
        'id' => 2,
        'name' => 'Communication',
        'type' => 2,
        'id_parent' => 1
    ],
    [
        'id' => 3,
        'name' => 'Respect du CI',
        'type' => 0,
        'id_parent' => 2
    ],
    [
        'id' => 4,
        'name' => 'Stratégie digitale',
        'type' => 0,
        'id_parent' => 2
    ],
    [
        'id' => 5,
        'name' => 'Expérience de marque',
        'type' => 2,
        'id_parent' => 1
    ],
    [
        'id' => 6,
        'name' => 'Gastronomie',
        'type' => 0,
        'id_parent' => 5
    ],
];

foreach($arrData AS $arrItem)
{
    $arrTreeById[$arrItem['id']] = $arrItem;
}

foreach($arrTreeById AS &$arrItem)
{
    if (isset($arrTreeById[$arrItem['id_parent']]))   
    {
        $arrTreeById[$arrItem['id_parent']]['arrChilds'][] = &$arrItem;
    }
    if ($arrItem['id_parent'] == 0) $intStartingKey = $arrItem['id'];
}

print_r($arrTreeById[$intStartingKey]);