搜索数组并查找依赖项

时间:2017-08-30 07:05:52

标签: php arrays

我有一个如下所示的树,其中包含第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”: “当前”},{ “父”: “2”, “item_level”: “3”, “ID”: “5”,“DISPLAY_NAME “:”Open Forms“},{”parent“:”5“,”item_level“:”4“,”id“:”9“,”display_name“:”Blog Request“},{”parent“:”9 “ ”item_level“: ”5“, ”ID“: ”10“, ”DISPLAY_NAME“: ”添加“},{ ”亲本“: ”9“, ”item_level“: ”5“, ”ID“:” 11 ”, “DISPLAY_NAME”: “更新”},{ “亲本”: “1”, “item_level”: “2”, “ID”: “3”, “DISPLAY_NAME”: “管道”},{ “父”: “3”,“item_level”:“3”,“id”:“6”,“display_name”:“Open Forms”},{“parent”:“6”,“item_level”:“4”,“id” :“12”,“display_name”:“Blog Request”},{“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”: “页脚”},{ “父”: “15”, “item_level”: “2”, “ID”: “16”, “DISPLAY_NAME”: “电话簿”},{ “父” :“15”,“item_level”:“2”,“id”:“17”,“display_name”:“密码管理员”},{“parent”:“0”,“item_level”:“1”,“id “:” 18" , “DISPLAY_NAME”: “归档”},{ “父”: “18”, “item_level”: “2”, “ID”: “19”, “DISPLAY_NAME”: “编辑”},{ “亲本”: “18”, “item_level”: “2”, “ID”: “20”, “DISPLAY_NAME”: “查看”},{ “父”: “18”, “item_level”: “2”, “ID”: “21”, “DISPLAY_NAME”: “删除”}]

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

     $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>';