Home  >  Article  >  Backend Development  >  PHP infinite classification code problem

PHP infinite classification code problem

WBOY
WBOYOriginal
2016-09-27 14:18:10839browse

I tried to write an infinite classification, but there were some problems. After thinking about it for a long time, I felt that the code was fine, but the result was incorrect. Now everyone is confused....

After reading some chestnuts online, it seems that the writing method is different from mine.


The array structure is as follows:

<code>Array
(
    [0] => Array
        (
            [id] => 1
            [name] => 代码
            [parent] => 0
        )

    [1] => Array
        (
            [id] => 3
            [name] => 动漫
            [parent] => 0
        )

    [2] => Array
        (
            [id] => 4
            [name] => 治愈
            [parent] => 3
        )

    [3] => Array
        (
            [id] => 5
            [name] => 励志
            [parent] => 3
        )

    [4] => Array
        (
            [id] => 6
            [name] => 机战
            [parent] => 3
        )

    [5] => Array
        (
            [id] => 7
            [name] => 百合
            [parent] => 3
        )

    [6] => Array
        (
            [id] => 8
            [name] => 资源
            [parent] => 0
        )

    [7] => Array
        (
            [id] => 9
            [name] => app
            [parent] => 8
        )

    [8] => Array
        (
            [id] => 10
            [name] => 软件
            [parent] => 8
        )

    [9] => Array
        (
            [id] => 11
            [name] => 黑科技
            [parent] => 8
        )

)</code>

Among them id is the unique ID of the category, parent is the parent class ID
The code I wrote is as follows:

<code>
    function all($id=0){

            static $_class = null;

            if(is_null($_class))
                    $_class = select();  //这个得出来的就是以上的数组结构,然后赋值给了`$_class`变量

            $result = array();
            foreach($_class as $k => $v){
                    if($v['parent'] == $id){
                            unset($_class[$k]);
                            $v = array_merge($v, $this->all($v['id']));
                            $result['child'][] = $v;
                    }
            }

            return $result;

    }

    print_r(all(0));</code>

Reply content:

I tried to write an infinite classification, but there were some problems. After thinking about it for a long time, I felt that the code was fine, but the result was incorrect. Now everyone is confused....

After reading some chestnuts online, it seems that the writing method is different from mine.


The array structure is as follows:

<code>Array
(
    [0] => Array
        (
            [id] => 1
            [name] => 代码
            [parent] => 0
        )

    [1] => Array
        (
            [id] => 3
            [name] => 动漫
            [parent] => 0
        )

    [2] => Array
        (
            [id] => 4
            [name] => 治愈
            [parent] => 3
        )

    [3] => Array
        (
            [id] => 5
            [name] => 励志
            [parent] => 3
        )

    [4] => Array
        (
            [id] => 6
            [name] => 机战
            [parent] => 3
        )

    [5] => Array
        (
            [id] => 7
            [name] => 百合
            [parent] => 3
        )

    [6] => Array
        (
            [id] => 8
            [name] => 资源
            [parent] => 0
        )

    [7] => Array
        (
            [id] => 9
            [name] => app
            [parent] => 8
        )

    [8] => Array
        (
            [id] => 10
            [name] => 软件
            [parent] => 8
        )

    [9] => Array
        (
            [id] => 11
            [name] => 黑科技
            [parent] => 8
        )

)</code>

Among them id is the unique ID of the category, parent is the parent class ID
The code I wrote is as follows:

<code>
    function all($id=0){

            static $_class = null;

            if(is_null($_class))
                    $_class = select();  //这个得出来的就是以上的数组结构,然后赋值给了`$_class`变量

            $result = array();
            foreach($_class as $k => $v){
                    if($v['parent'] == $id){
                            unset($_class[$k]);
                            $v = array_merge($v, $this->all($v['id']));
                            $result['child'][] = $v;
                    }
            }

            return $result;

    }

    print_r(all(0));</code>

unset($_class[$k]);
Remove this line

Since you still use recursion to complete this, I provide 2 methods here, one is recursive and the other is in pointer form.

You may not be able to understand the second one, but to help you learn and make it easier for others, here is the code:

Use recursion

<code>// 呃,我真不忍心写出这个循环那么多遍的代码,求神解救我。

function _data_to_tree(&$items, $topid = 0, $with_id = TRUE)
{
    $result = [];
    foreach($items as $v)
        if ($topid == $v['parent'])  {
            $r = $v + ['children' => _data_to_tree($items, $v['id'], $with_id)];
            if ($with_id)
                $result[$v['id']] = $r;
            else
                $result[] = $r;
        }
            
    return $result;
}
</code>

Use PHP’s pointer features

<code>function _data_to_tree($items, $topid = 0, $with_id = TRUE)
{
    if ($with_id)
        foreach ($items as $item)
            $items[ $item['parent'] ]['children'][ $item['id'] ] = &$items[ $item['id'] ];
    else
        foreach ($items as $item)
                $items[ $item['parent'] ]['children'][] = &$items[ $item['id'] ];

         return isset($items[ $topid ]['children']) ? $items[ $topid ][ 'children' ] : [];
}</code>

Use

Pass in your above array, for example, the topmost ID is 0

<code>$data = [
   ['id' => 4, 'parent' => 1 , 'text' => 'Parent1'], 
   ['id' => 1, 'parent' => 0 , 'text' => 'Root'],
   ['id' => 2, 'parent' => 1 , 'text' => 'Parent2'], 
   ['id' => 3, 'parent' => 2 , 'text' => 'Sub1'], 
];
print_r ( _data_to_tree($data, 0) );

</code>

Results

<code>Array
(
    [1] => Array
        (
            [id] => 1
            [parent] => 0
            [text] => Root
            [children] => Array
                (
                    [4] => Array
                        (
                            [id] => 4
                            [parent] => 1
                            [text] => Parent1
                            [children] => Array
                                (
                                )
                        )
                    [2] => Array
                        (
                            [id] => 2
                            [parent] => 1
                            [text] => Parent2
                            [children] => Array
                                (
                                    [3] => Array
                                        (
                                            [id] => 3
                                            [parent] => 2
                                            [text] => Sub1
                                            [children] => Array
                                                (
                                                )
                                        )
                                )
                        )
                )
        )
)</code>
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn