【问题标题】:php multiple dimension array to father child relationship arrayphp多维数组到父子关系数组
【发布时间】:2014-07-01 16:15:16
【问题描述】:

我有一个这样的多维数组:

Array
(
    [0] => Array
        (
            [id] => 14061
            [subchannel] => Array
                (
                    [0] => Array
                        (
                            [id] => 14144
                            [subchannel] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 14154
                                            [subchannel] => Array
                                                (
                                                )

                                            [name] => 14154name
                                        )
                                    [1] => Array
                                        (
                                            [id] => 14155
                                            [subchannel] => Array
                                                (
                                                )

                                            [name] => 14155name
                                        )
                                    [2] => Array
                                        (
                                            [id] => 14156
                                            [subchannel] => Array
                                                (
                                                )

                                            [name] => 14156name
                                        )                             
                                )
                            [name] => 14144name
                        )
                    [1] => Array
                        (
                            [id] => 14145
                            [subchannel] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 14161
                                            [subchannel] => Array
                                                (
                                                )

                                            [name] => 14161name
                                        )

                                    [1] => Array
                                        (
                                            [id] => 14162
                                            [subchannel] => Array
                                                (
                                                )

                                            [name] => 14162name
                                        )

                                    [2] => Array
                                        (
                                            [id] => 14163
                                            [subchannel] => Array
                                                (
                                                )

                                            [name] => 14163name
                                        )                                 
                                )
                            [name] => 14145name
                        )
                    [2] => Array
                        (
                            [id] => 14146
                            [subchannel] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 14167
                                            [subchannel] => Array
                                                (
                                                )

                                            [name] => 14167name
                                        )

                                    [1] => Array
                                        (
                                            [id] => 14168
                                            [subchannel] => Array
                                                (
                                                )

                                            [name] => 14168name
                                        )

                                    [2] => Array
                                        (
                                            [id] => 14169
                                            [subchannel] => Array
                                                (
                                                )

                                            [name] => 14169name
                                        )                                  
                                )

                            [name] => 14146name
                        )                   

                )

            [name] => 14061name
        )

    [1] => Array
        (
            [id] => 14062
            [subchannel] => Array
                (
                )

            [name] => 14062name
        )

    [2] => Array
        (
            [id] => 14063
            [subchannel] => Array
                (
                )

            [name] => 14063name
        )

)

我想把上面的多维数组改成父子关系数组包含这个(pid表示parentid):

[id=>14061,pid=>0,name=>14061name]
[id=>14062,pid=>0,name=>14062name]
[id=>14063,pid=>0,name=>14063name]

[id=>14144,pid=>14061,name=>14144name]
[id=>14145,pid=>14061,name=>14145name]
[id=>14146,pid=>14061,name=>14146name]


[id=>14154,pid=>14144,name=>14154name]
[id=>14155,pid=>14144,name=>14155name]
[id=>14156,pid=>14144,name=>14156name]

[id=>14161,pid=>14145,name=>14161name]
[id=>14162,pid=>14145,name=>14162name]
[id=>14163,pid=>14145,name=>14163name]

[id=>14167,pid=>14146,name=>14167name]
[id=>14168,pid=>14146,name=>14168name]
[id=>14169,pid=>14146,name=>14169name]

我使用了一个函数,但只是获取 $this->data 中的 id:

function arr_foreach ($arr) 
    {           
        if (!is_array ($arr)) 
        {
            return false;
        }

        foreach ($arr as $key => $val ) 
        {
            if (is_array ($val)) 
            {
                $this->arr_foreach ($val);              
            } 
            else 
            {
                if($key == "id"){
                    $this->data[] = $val;
                }
            }
        }
    }

任何人都可以编写一个 php 代码来执行此操作吗?

【问题讨论】:

  • 想想 PHP 有多流行,我相信很多人都可以——但这不是重点。你需要帮助自己做这件事吗?那么至少请尝试一下!
  • 我是php新手,试了快半天了。请帮忙。非常感谢。
  • 这很可能可以通过一些有趣的递归函数来完成。

标签: php arrays parent-child relationship


【解决方案1】:

您发布的尝试已经相当不错了。但是,我不会递归每个数组,而是总是跳过一个级别。

这是什么意思?当您进入foreach() 时,您将拥有一个结构数组

[
  'id' => ..,
  'subchannel' => ..,
  'name' => ..
]

现在,您可以传递subchannel 子数组,而不是将整个数组交给下一级递归。唯一剩下的就是知道父母的id。但这可以通过添加另一个参数并在递归传递当前 id 时轻松完成(因此它将是更深层元素的父元素)。

这会给你一个类似的功能

function flatten($array, $parent = NULL) {
    if (!is_array($array) || empty($array))
        return;

    foreach ($array as $key=>$value) {
        //something is wrong/incomplete
        if (!is_array($value) || !isSet($value['id'], $value['subchannel'], $value['name']))
            continue;

        $this->flatten($value['subchannel'], $value['id']);
        $this->data[] = array(
            'id' => $value['id'],
            'pid' => $parent,
            'name' => $value['name']
        );
    }
}

您还会注意到我添加了条件empty($array)。由于这里是这里,因此无需在 foreach() 内进行额外检查以查看该元素是否真的有子元素 - 下一级递归将检查并在必要时停止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    相关资源
    最近更新 更多