【问题标题】:search array and find depedent items搜索数组并查找依赖项
【发布时间】:2017-08-30 07:05:51
【问题描述】:

我有一个像下面这样的树,它包含第 n 级权限。

            Landing Page                                Footer                          Archive
                ||                                      ||                              ||
                ||                                      ||                              ||
Current  ==========  Pipeline=== BHI                Phonebook==Password Keeper      Edit==View==Delete
    ||                  ||
    Open Forms          Open Forms
    ||                  ||
    Blog Request        Blog Request
    ||                  ||
    Add == Edit         Add == Edit

样本数组

$list = Array
(
    [0] => Array
        (
            [parent] => 0
            [item_level] => 1
            [id] => 1
            [display_name] => Landing Page
        )

    [1] => Array
        (
            [parent] => 1
            [item_level] => 2
            [id] => 2
            [display_name] => Current
        )

    [2] => Array
        (
            [parent] => 2
            [item_level] => 3
            [id] => 5
            [display_name] => Open Forms
        )

    [3] => Array
        (
            [parent] => 5
            [item_level] => 4
            [id] => 9
            [display_name] => Blog Request
        )

    [4] => Array
        (
            [parent] => 9
            [item_level] => 5
            [id] => 10
            [display_name] => Add
        )

    [5] => Array
        (
            [parent] => 9
            [item_level] => 5
            [id] => 11
            [display_name] => Update
        )

    [6] => Array
        (
            [parent] => 1
            [item_level] => 2
            [id] => 3
            [display_name] => Pipeline
        )

    [7] => Array
        (
            [parent] => 3
            [item_level] => 3
            [id] => 6
            [display_name] => Open Forms
        )

    [8] => Array
        (
            [parent] => 6
            [item_level] => 4
            [id] => 12
            [display_name] => Blog Request
        )

    [9] => Array
        (
            [parent] => 12
            [item_level] => 5
            [id] => 13
            [display_name] => Add
        )

    [10] => Array
        (
            [parent] => 12
            [item_level] => 5
            [id] => 14
            [display_name] => Update
        )

    [11] => Array
        (
            [parent] => 1
            [item_level] => 2
            [id] => 4
            [display_name] => BHI
        )

    [12] => Array
        (
            [parent] => 1
            [item_level] => 2
            [id] => 7
            [display_name] => Add Property
        )

    [13] => Array
        (
            [parent] => 1
            [item_level] => 2
            [id] => 8
            [display_name] => Show Child Properties
        )

    [14] => Array
        (
            [parent] => 0
            [item_level] => 1
            [id] => 15
            [display_name] => Footer
        )

    [15] => Array
        (
            [parent] => 15
            [item_level] => 2
            [id] => 16
            [display_name] => Phonebook
        )

    [16] => Array
        (
            [parent] => 15
            [item_level] => 2
            [id] => 17
            [display_name] => Password Keeper
        )

    [17] => Array
        (
            [parent] => 0
            [item_level] => 1
            [id] => 18
            [display_name] => Archive
        )

    [18] => Array
        (
            [parent] => 18
            [item_level] => 2
            [id] => 19
            [display_name] => Edit
        )

    [19] => Array
        (
            [parent] => 18
            [item_level] => 2
            [id] => 20
            [display_name] => View
        )

    [20] => Array
        (
            [parent] => 18
            [item_level] => 2
            [id] => 21
            [display_name] => Delete
        )

)

预期输出

//Here Key is the value of "id" attribute
$final_output = array(
    1 => array(
                2=>array(5=>array(9=>array(10,11))),
                3=>array(6=>array(12=>array(13,14))),
                4,//As it doesnt have any child
                7,//As it doesnt have any child
                8 //As it doesnt have any child
        ),
    15 => array(
            16, //As it doesnt have any child
            17 ////As it doesnt have any child
        ),
    18 => array(
            19, //As it doesnt have any child
            20, ////As it doesnt have any child
            21 ////As it doesnt have any child
        ),
);

这里,1:登陆页面,15:页脚,18:存档(其“Id”属性)等。

在上述数组之后,我将不得不进行第 n 级循环。
喜欢:

foreach($final_output  as $res)
{
    if(is_array($res))
    {
        //Then do something, i am not sure how this achivable
    }
}

到目前为止我做了什么,但没有成功。

//To find out the how manhy levels are in array
$unique_level = array_unique(array_map(function ($i) { return $i['item_level']; }, $list));

$parent_data = $level_data = array();
foreach($list as $key=>$res)
{
    if($res['parent']==0)
    {
        if(!array_key_exists($res['id'],$parent_data)) // First insert all unique parent at level 1
        {
            $parent_data[$res['id']] = $res;
        }
    }

    $level_data[$res['parent']][] = array(
            'display_name' => $res['display_name'],
            'id' => $res['id'],
            'parent' => $res['parent'],
    );
}

准备使用json

[{"parent":"0","item_level":"1","id":"1","display_name":"着陆页"},{"parent":"1","item_level ":"2","id":"2","display_name":"Current"},{"parent":"2","item_level":"3","id":"5","display_name ":"打开表单"},{"parent":"5","item_level":"4","id":"9","display_name":"博客请求"},{"parent":"9 ","item_level":"5","id":"10","display_name":"Add"},{"parent":"9","item_level":"5","id":"11 ","display_name":"Update"},{"parent":"1","item_level":"2","id":"3","display_name":"Pipeline"},{"parent": "3","item_level":"3","id":"6","display_name":"打开表单"},{"parent":"6","item_level":"4","id" :"12","display_name":"博客请求"},{"parent":"12","item_level":"5","id":"13","display_name":"Add"},{ "父":"12","item_level":"5","id":"14","display_name":"更新"},{"父":"1","item_level":"2", "id":"4","display_name":"BHI"},{"parent":"1","item_level":"2","id":"7","display_name":"添加属性" },{"parent":"1","item_level":"2","id":"8","display_name":"显示子属性"},{"parent":"0","item_level" :"1","id":"1 5","display_name":"Footer"},{"parent":"15","item_level":"2","id":"16","display_name":"电话簿"},{"parent" :"15","item_level":"2","id":"17","display_name":"密码管理员"},{"parent":"0","item_level":"1","id ":"18","display_name":"Archive"},{"parent":"18","item_level":"2","id":"19","display_name":"Edit"},{ "parent":"18","item_level":"2","id":"20","display_name":"View"},{"parent":"18","item_level":"2", "id":"21","display_name":"删除"}]

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    我得到的最近的是......

    $list = json_decode($data, true);
    $baseList = array_combine(array_column($list,'id'), $list);
    $hierarchy = [];
    
    foreach ( $baseList as $newItem )   {
        $parent = $newItem['parent'];
        $hierarchy[$parent][] = $newItem['id']; 
    }
    function buildTree ( $startNode, $hierarchy)    {
        $newLevel = [];
        foreach ( $startNode as $children ) {
            if ( isset($hierarchy[$children]))   {
                $newLevel[$children] = buildTree($hierarchy[$children], $hierarchy);
            }
            else    {
                $newLevel[$children] = $children;
            }
        }
        return $newLevel;
    }
    $finalOutput = buildTree ( $hierarchy[0], $hierarchy );
    print_r($finalOutput);
    

    你遇到的问题是你有像......这样的元素

    1 => array(
                2=>array(5=>array(9=>array(10,11))),
                3=>array(6=>array(12=>array(13,14))),
                4,//As it doesnt have any child
                7,//As it doesnt have any child
                8 //As it doesnt have any child
        ),
    

    由于您几乎有没有键的元素 4、7 和 8 - 数组中的所有元素都有一个键,所以这是行不通的。

    我所做的输出是......

    Array
    (
        [1] => Array
            (
                [2] => Array
                    (
                        [5] => Array
                            (
                                [9] => Array
                                    (
                                        [10] => 10
                                        [11] => 11
                                    )
    
                            )
    
                    )
    
                [3] => Array
                    (
                        [6] => Array
                            (
                                [12] => Array
                                    (
                                        [13] => 13
                                        [14] => 14
                                    )
    
                            )
    
                    )
    
                [4] => 4
                [7] => 7
                [8] => 8
            )
    
        [15] => Array
            (
                [16] => 16
                [17] => 17
            )
    
        [18] => Array
                [19] => 19
                [20] => 20
                [21] => 21
            )
    
    )     [19] => 19
                [20] => 20
                [21] => 21
            )
    
    )
    

    如您所见,元素 4 的值为 4。

    【讨论】:

    • 很高兴能够提供帮助。你能把它标记为已回答吗,谢谢:)
    【解决方案2】:
         $list = Array
          (
            0 => Array
                (
                    'parent' => 0,
                    'item_level' => 1,
                    'id' => 1,
                    'display_name' => 'Landing Page'
                ),
    
            1 => Array
                (
                    'parent' => 1,
                    'item_level' => 2,
                    'id' => 2,
                    'display_name' => 'Current'
                ),
    
            2 => Array
                (
                    'parent' => 2,
                    'item_level' => 3,
                    'id' => 5,
                    'display_name' => 'Open Forms'
                ),
    
            3 => Array
                (
                    'parent' => 5,
                    'item_level' => 4,
                    'id' => 9,
                    'display_name' => 'Blog Request'
                ),
    
            4 => Array
                (
                    'parent' => 9,
                    'item_level' => 5,
                    'id' => 10,
                    'display_name' => 'Add'
                ),
    
            5 => Array
                (
                    'parent' => 9,
                    'item_level' => 5,
                    'id' => 11,
                    'display_name' => 'Update'
                ),
    
            6 => Array
                (
                    'parent' => 1,
                    'item_level' => 2,
                    'id' => 3,
                    'display_name' => 'Pipeline'
                ),
    
            7 => Array
                (
                    'parent' => 3,
                    'item_level' => 3,
                    'id' => 6,
                    'display_name' => 'Open Forms'
                ),
    
            8 => Array
                (
                    'parent' => 6,
                    'item_level' => 4,
                    'id' => 12,
                    'display_name' => 'Blog Request'
                ),
    
            9 => Array
                (
                    'parent' => 12,
                    'item_level' => 5,
                    'id' => 13,
                    'display_name' => 'Add'
                ),
    
            10 => Array
                (
                    'parent' => 12,
                    'item_level' => 5,
                    'id' => 14,
                    'display_name' => 'Update'
                ),
    
            11 => Array
                (
                    'parent' => 1,
                    'item_level' => 2,
                    'id' => 4,
                    'display_name' => 'BHI'
                ),
    
            12 => Array
                (
                    'parent' => 1,
                    'item_level' => 2,
                    'id' => 7,
                    'display_name' => 'Add Property'
                ),
    
            13 => Array
                (
                    'parent' => 1,
                    'item_level' => 2,
                    'id' => 8,
                    'display_name' => 'Show Child Properties'
                ),
    
            14 => Array
                (
                    'parent' => 0,
                    'item_level' => 1,
                    'id' => 15,
                    'display_name' => 'Footer'
                ),
    
            15 => Array
                (
                    'parent' => 15,
                    'item_level' => 2,
                    'id' => 16,
                    'display_name' => 'Phonebook'
                ),
    
            16 => Array
                (
                    'parent' => 15,
                    'item_level' => 2,
                    'id' => 17,
                    'display_name' => 'Password Keeper'
                ),
    
            17 => Array
                (
                    'parent' => 0,
                    'item_level' => 1,
                    'id' => 18,
                    'display_name' => 'Archive'
                ),
    
            18 => Array
                (
                    'parent' => 18,
                    'item_level' => 2,
                    'id' => 19,
                    'display_name' => 'Edit'
                ),
    
            19 => Array
                (
                    'parent' => 18,
                    'item_level' => 2,
                    'id' => 20,
                    'display_name' => 'View'
                ),
    
            20 => Array
                (
                    'parent' => 18,
                    'item_level' => 2,
                    'id' => 21,
                    'display_name' => 'Delete'
                ),
    
          );
    

    你好,试试这个代码:

      $results=array();
        $parent1='';$parent=$parent2='';
        foreach ($list as $key => $value) {
        if($value['parent']==0)
        {
        $results[$value['id']]=$value;
        $id=$value["id"];
    
        }
        if($id==$value['parent']&&$id!="")
        {
        $results[$id][$value['id']]=$value;
        $parent=$value['id'];
        }
    
        if($parent==$value['parent']&&$parent!="")
        {
    
        $results[$id][$parent][$value['id']]=$value;
        $parent1=$value['id'];
    
        }
        if($parent1==$value['parent']&&$parent1!="")
        {  
    
        $results[$id][$parent][$parent1][$value['id']]=$value;
        $parent2=$value['id'];
        }
    
        if($parent2==$value['parent']&&$parent2!="")
        {  
    
        $results[$id][$parent][$parent1][$parent2][$value['id']]=$value;
        $parent3=$value['id'];
        }
    
        }
        echo '<pre>';
        print_r($results);
        echo '</pre>';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 2016-05-24
      • 2011-09-12
      • 2011-02-12
      • 1970-01-01
      • 2013-04-30
      相关资源
      最近更新 更多