Tom
Tom

Reputation: 12998

Loop through multidimensional array and unset matching items

I have a multidimensional array and I want to loop through every item on every level and remove any items where 'children' and 'attribute_id' are both empty (in this case the last 2 items with a key of 56 and 70).

Array
(
    [11] => Array
        (
            [page_id] => 11
            [page_parent_id] => 0
            [attribute_id] => 8
            [children] => Array
                (
                )

        )

    [12] => Array
        (
            [page_id] => 12
            [page_parent_id] => 0
            [attribute_id] => 
            [children] => Array
                (
                    [49] => Array
                        (
                            [page_id] => 49
                            [page_parent_id] => 12
                            [attribute_id] => 
                            [children] => Array
                                (
                                    [50] => Array
                                        (
                                            [page_id] => 50
                                            [page_parent_id] => 49
                                            [attribute_id] => 32
                                            [children] => Array
                                                (
                                                )

                                        )

                                )

                        )

                )

        )

    [13] => Array
        (
            [page_id] => 13
            [page_parent_id] => 0
            [attribute_id] => 9
            [children] => Array
                (
                )

        )

    [46] => Array
        (
            [page_id] => 46
            [page_parent_id] => 0
            [attribute_id] => 
            [children] => Array
                (
                    [52] => Array
                        (
                            [page_id] => 52
                            [page_parent_id] => 46
                            [attribute_id] => 34
                            [children] => Array
                                (
                                )

                        )

                    [53] => Array
                        (
                            [page_id] => 53
                            [page_parent_id] => 46
                            [attribute_id] => 
                            [children] => Array
                                (
                                    [54] => Array
                                        (
                                            [page_id] => 54
                                            [page_parent_id] => 53
                                            [attribute_id] => 35
                                            [children] => Array
                                                (
                                                )

                                        )
                                    [70] => Array
                                        (
                                            [page_id] => 70
                                            [page_parent_id] => 53
                                            [attribute_id] => 
                                            [children] => Array
                                                (
                                                )

                                        )

                                )

                        )

                    [56] => Array
                        (
                            [page_id] => 56
                            [page_parent_id] => 46
                            [attribute_id] => 
                            [children] => Array
                                (
                                )

                        )

                )

        )

)

I've got this so far which I can echo out the items I want to unset but I'm not sure how to get it so I can actually unset it.

function loop($a) {
    if(empty($a['children']))
    {
        if(empty($a['attribute_id']))
        {
            var_dump($a);
        }
    } else {
        foreach($a['children'] as $v) {
            loop($v);
        }
    }
}

foreach($pages as $p)
{
    loop($p);
}

Upvotes: 0

Views: 47

Answers (1)

brevis
brevis

Reputation: 1201

Something like this:

function loop($a) {
    $newArray = array();
    foreach ($a as $k => $v) {
        if (isset($v['children']) && count($v['children']) > 0 ) {
            $v['children'] = loop($v['children']);
        }

        if ((isset($v['children']) && count($v['children']) > 0) || !empty($v['attribute_id'])) {
            $newArray[$k] = $v;
        }
    }
    return $newArray;
}
$newArray = loop($a);

Upvotes: 1

Related Questions