如何基于每个父ID递归地构造数组

时间:2014-05-20 10:28:11

标签: php arrays codeigniter recursion

我有一个嵌套的类别列表,其中DB看起来像这样:

id      parent_id       title
83      81              test3
86      83              test1
87      83              test2
94      87              subtest2.1
95      87              subtest2.2
...etc...

我需要将所有子元素id添加到每个父ID的$checked_elements数组中。

因此,如果选择了某个特定的ID,它会自动添加到$checked_elements的数组中。这是它的样子:

enter image description here

我坚持使用递归函数,关于如何添加每个父项id的递归子项?我的功能不会比第二级更深入,有人能告诉我如何解决这个问题,以便检查所有子项吗?

private function delete( ){

    // Collect all checked elements into the array
    $checked_elements = $this->input->post('checked');

    // Recursive function to check for child elementts
    foreach( $checked_elements as $key => $value ){

        // Get records where parent_id is equal to $value (checked item's id)
        $childs = $this->categories_model->get_by(array('parent_id' => $value));

        // Add found record's id into the array 
        foreach( $childs as $child ){

            $checked_elements[] => $child->id;

        }

    }

}

1 个答案:

答案 0 :(得分:1)

您可以尝试通过引用传递累加器数组:

function collect($ids, &$items) {
    foreach($ids as $id){
        $items[] = $id;
        $childs = $this->categories_model->get_by(array('parent_id' => $id));
        collect(array_column($childs, 'id'), $items);
    }
    return $items;
}

function delete( ){
    $items = array();
    collect($this->input->post('checked'), $items);
    //... delete $items
}

在php 5.5+中,您也可以使用与此类似的方式使用生成器:

function collect($ids) {
    foreach($ids as $id) {
        yield $id;
        $childs = $this->categories_model->get_by(array('parent_id' => $id));
        foreach(collect(array_column($childs, 'id')) as $id)
            yield $id;
}


function delete( ){
    $ids = collect($this->input->post('checked'));

我认为你的树很小,否则我会建议一种更有效的方法,比如嵌套集。

如果您的php版本不支持array_column,则可以使用this shim