Search code examples
phpmultidimensional-arrayarray-unset

How can I delete empty "branch" of a multidimensional array


I have the follow problem. I got this array structure:

Array
(
    [1702] => Array
        (
            [unit] => Unit name
            [info] => Array
                (
                    [735100] => Array
                        (
                            [group] => Ac Fluorhidricos
                        )

                    [0] => Array
                        (
                            [group] => Other
                            [services] => Array
                                (
                                    [731171] => [ARES70] Oil 01
                                    [731172] => [ARES71] Oil 02
                                    [731112] => [ARES11] Oil 03
                                )

                        )

                    [733496] => Array
                        (
                            [group] => Activity
                        )

                    [732216] => Array
                        (
                            [group] => Water SMA
                        )

                    [732280] => Array
                        (
                            [group] => Water MAR SMA
                        )

                    [732307] => Array
                        (
                            [group] => Blue water SMA
                        )

                    [732369] => Array
                        (
                            [group] => Residual water SMA
                            [services] => Array
                                (
                                    [732373] => [ARESSMA05] Water 01
                                    [732388] => [ARESSMA20] Water 02
                                    [732374] => [ARESSMA06] Water 03
                                    [732397] => [ARESSMA29] Water 04
                                    [732375] => [ARESSMA07] Water 05
                                )

                        )

                )

        )

)

But I need to delete all elements that do not contain "services" in the array:

Array
(
    [1702] => Array
        (
            [unit] => Unit name
            [info] => Array
                (

                    [0] => Array
                        (
                            [group] => Other
                            [services] => Array
                                (
                                    [731171] => [ARES70] Oil 01
                                    [731172] => [ARES71] Oil 02
                                    [731112] => [ARES11] Oil 03
                                )

                        )

                    [732369] => Array
                        (
                            [group] => Residual water SMA
                            [services] => Array
                                (
                                    [732373] => [ARESSMA05] Water 01
                                    [732388] => [ARESSMA20] Water 02
                                    [732374] => [ARESSMA06] Water 03
                                    [732397] => [ARESSMA29] Water 04
                                    [732375] => [ARESSMA07] Water 05
                                )

                        )

                )

        )

)

I have been trying to use the array_filter function but I am not getting the result I need. I would greatly appreciate your help.

I'm hoping for some clue or function that can help me solve the problem.


Solution

  • You can do it like this, assuming the structure of your array is always like you posted (numerical key in the first level, unit and info in the second, a list of arrays potentially having the key of services in their first level). A lot of assumptions, for sure, but if you know that this is the structure you'll have, it'll work.

    <?php
    $arr = [
        1702 => [
            "unit" => "Unit name",
            "info" => [
                735100 => [
                    "group" => "Ac Fluorhidricos",
                ],
                0 => [
                    "group" => "Other",
                    "services" => [
                        "731171" => "[ARES70] Oil 01",
                        "731172" => "[ARES71] Oil 02",
                        "731112" => "[ARES11] Oil 03",
                    ]
                ],
                733496 => [
                    "group" => "Activity"
                ],
                732216 => [
                    "group" => "Water SMA"
                ],
                732280 => [
                    "group" => "Water MAR SMA"
                ],
                732307 => [
                    "group" => "Blue water SMA"
                ],
                732369 => [
                    "group" => "Residual water SMA",
                    "services" => [
                        732373 => "[ARESSMA05] Water 01",
                        732388 => "[ARESSMA20] Water 02",
                        732374 => "[ARESSMA06] Water 03",
                        732397 => "[ARESSMA29] Water 04",
                        732375 => "[ARESSMA07] Water 05"
                    ]
                ]
            ]
        ]
    ];
    
    $endArr = [];
    foreach($arr as $key=>$value) {
        // Just setting it out right
        // We'll remove what we don't need
        // once we come to it...
        $endArr[$key] = $value;
        $info = $value["info"];
        foreach($info as $itemId=>$item) {
            // ... right about here
            if(!in_array("services",array_keys($item))) {
                unset($endArr[$key]["info"][$itemId]);
            }
        }
        
        // Optional - if there's nothing left within info, remove it
        // Commented out, since you didn't specify whether you want that
        // if(!$endArr[$key]["info"]) {
        //    unset($endArr[$key];  
        // }
    }
    
    print_r($endArr);
    

    The output:

    Array
    (
        [1702] => Array
            (
                [unit] => Unit name
                [info] => Array
                    (
                        [0] => Array
                            (
                                [group] => Other
                                [services] => Array
                                    (
                                        [731171] => [ARES70] Oil 01
                                        [731172] => [ARES71] Oil 02
                                        [731112] => [ARES11] Oil 03
                                    )
                            )
                        [732369] => Array
                            (
                                [group] => Residual water SMA
                                [services] => Array
                                    (
                                        [732373] => [ARESSMA05] Water 01
                                        [732388] => [ARESSMA20] Water 02
                                        [732374] => [ARESSMA06] Water 03
                                        [732397] => [ARESSMA29] Water 04
                                        [732375] => [ARESSMA07] Water 05
                                    )
                            )
                    )
            )
    )
    

    Test it here.