PHP Построить массив строк из многомерного массива - PullRequest
0 голосов
/ 14 октября 2018

У меня есть многомерный массив, который имеет такую ​​структуру:

[
    {
        "id": 1,
        "parentID": 0,
        "view": "App",
        "name": "view",
        "children": [
            {
                "id": 2,
                "parentID": 1,
                "view": "Analytics",
                "name": "view",
                "children": [
                    {
                        "id": 3,
                        "parentID": 2,
                        "view": "Summary",
                        "name": "view",
                        "children": [
                            {
                                "id": 11,
                                "parentID": 3,
                                "view": "Apps",
                                "name": "view"
                            },
                            {
                                "id": 12,
                                "parentID": 3,
                                "view": "Devices",
                                "name": "view"
                            }
                        ]
                    },
                    {
                        "id": 4,
                        "parentID": 2,
                        "view": "Overview",
                        "name": "view"
                    },
                    {
                        "id": 5,
                        "parentID": 2,
                        "view": "Insights",
                        "name": "view"
                    },
                    {
                        "id": 7,
                        "parentID": 2,
                        "view": "DeviceData",
                        "name": "view"
                    },
                    {
                        "id": 8,
                        "parentID": 2,
                        "view": "Geolocation",
                        "name": "view"
                    },
                    {
                        "id": 6,
                        "parentID": 2,
                        "view": "NetworkInsights",
                        "name": "view"
                    }
                ]
            },
            {
                "id": 9,
                "parentID": 1,
                "view": "VirtualAppInstaller",
                "name": "view",
                "children": [
                    {
                        "id": 10,
                        "parentID": 9,
                        "view": "AppManager",
                        "name": "view"
                    }
                ]
            }
        ]
    }
]

, однако мне нужно создать массив строк, который содержит каждый элемент ключа view .

Примерно так:

[
 "App.Analytics.Summary.Apps",
 "App.Analytics.Summary.Devices",
 "App.Analytics.Overview",
 "App.Analytics.Insights",
 ... , 
 ... , 
 "App.VirtualAppInstaller.AppManager"
]

Я думал о создании рекурсивной функции для извлечения каждого объекта, содержащего тег view

, однако я не могу понятьчто может быть лучшим подходом.

ОБНОВЛЕНИЕ

Мне удалось реализовать рекурсивную функцию

function recursion($array) { 
        foreach ($array as $key => $value) { 
            if($key==='view'){ 
                var_dump($value);
            } 
            if(is_array($value)){
                $this->recursion($value);    
            }
        } 
}

РЕЗУЛЬТАТ:

string(3)"App"string(9)"Analytics"string(7)"Summary"string(4)"Apps"string(7)"Devices"string(8)"Overview"string(8)"Insights"string(10)"DeviceData"string(11)"Geolocation"string(15)"NetworkInsights"string(19)"VirtualAppInstaller"string(10)"AppManager"{}

однако теперь я застрял в том, чтобы узнать, когда функция достигла конца дочернего элемента, и с этим создаю первую строку

1 Ответ

0 голосов
/ 14 октября 2018

Эта рекурсивная функция будет делать то, что вы хотите.Он пересекает каждый элемент в массиве и его дочерних элементах, формируя строки из ключей view по ходу дела:

function get_views($array) {
    $views = array();
    foreach ($array as $elem) {
        if (isset($elem['children'])) {
            foreach (get_views($elem['children']) as $child_view) {
                $views[] = $elem['view'] . "." . $child_view;
            }
        }
        else {
            $views[] = $elem['view'];
        }
    }
    return $views;
}

print_r(get_views($array));

Для вашего массива-образца вывод:

Array

(
    [0] => App.Analytics.Summary.Apps
    [1] => App.Analytics.Summary.Devices
    [2] => App.Analytics.Overview
    [3] => App.Analytics.Insights
    [4] => App.Analytics.DeviceData
    [5] => App.Analytics.Geolocation
    [6] => App.Analytics.NetworkInsights
    [7] => App.VirtualAppInstaller.AppManager
)

Демонстрация на rextester

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...