В php как получить все ключи многомерного массива с неизвестной глубиной - PullRequest
2 голосов
/ 25 февраля 2020

Мне нужно получить все ключи из этого массива. Я попытался с рекурсивным вызовом, но только получить ключи первого элемента. Я хочу, чтобы все ключи массива сохранялись в массив с уровнем. означает keys[0] = array(540,198). ниже массив, который я хочу пройти и получить все ключи. Я работал более 1 дня, но ничего не получил, пожалуйста, помогите исправить это.

(
    [ch] => Array
        (
            [540] => Array
                (
                    [194] => Array
                        (
                            [16] => Array
                                (
                                    [144] => Array
                                        (
                                        )

                                    [145] => Array
                                        (
                                        )

                                    [146] => Array
                                        (
                                        )

                                    [147] => Array
                                        (
                                        )

                                    [148] => Array
                                        (
                                        )

                                    [195] => Array
                                        (
                                        )

                                    [199] => Array
                                        (
                                        )

                                    [149] => Array
                                        (
                                        )

                                    [200] => Array
                                        (
                                        )

                                    [150] => Array
                                        (
                                        )

                                    [444] => Array
                                        (
                                        )

                                    [151] => Array
                                        (
                                        )

                                    [445] => Array
                                        (
                                        )

                                    [446] => Array
                                        (
                                        )

                                    [152] => Array
                                        (
                                        )

                                )

                        )

                )

            [198] => Array
                (
                    [194] => Array
                        (
                            [16] => Array
                                (
                                    [144] => Array
                                        (
                                        )

                                    [145] => Array
                                        (
                                        )

                                    [146] => Array
                                        (
                                        )

                                    [147] => Array
                                        (
                                        )

                                    [148] => Array
                                        (
                                        )

                                    [195] => Array
                                        (
                                        )

                                    [199] => Array
                                        (
                                        )

                                    [149] => Array
                                        (
                                        )

                                    [200] => Array
                                        (
                                        )

                                    [150] => Array
                                        (
                                        )

                                    [444] => Array
                                        (
                                        )

                                    [151] => Array
                                        (
                                        )

                                    [445] => Array
                                        (
                                        )

                                    [446] => Array
                                        (
                                        )

                                    [152] => Array
                                        (
                                        )

                                )

                        )

                )

        )

)
$this->checkProductConfiguraions($configuraion,$count,$levelKeys);
function checkProductConfiguraions($configuraion,$count,$levelKeys) {
    foreach ($configuraions as $configuraion) {
        if (is_array($configuraion)) {
                $parentKeys = array_keys($configuraion);
                if(isset($levelKeys[$count])){
                    $levelKeys[$count] = array_unique(array_merge($levelKeys[$count],$parentKeys));
                } else {
                    $levelKeys[$count] = $parentKeys;
                }

                $count++;
                $levelKeys[$count] = array();
                for($i=0;$i<count($parentKeys);$i++){
                    $levelKeys[$count] = array_unique(array_merge($levelKeys[$count],array_keys($configuraion[$parentKeys[$i]])));
                    if(is_array($configuraion)){
                        $levelKeys = $this->checkProductConfiguraions($configuraion,$count,$levelKeys);
                    }
                }
        }
    }
}

1 Ответ

1 голос
/ 25 февраля 2020
function check($configurations, $count = 0, $levelKeys = array())
{
    foreach ($configurations as $k => $configuration) {
        if (!array_key_exists($count, $levelKeys) || 
            !in_array($k, $levelKeys[$count], true)) {
            $levelKeys[$count][] = $k;
        }
        if (!empty($configuration)) {
            $levelKeys = $this->check($configuration, $count + 1, $levelKeys);
        }
    }
    return $levelKeys;
}

DEMO

Во время первого раунда я заполняю переменную $levelKeys первой клавишей.

В первом IF Я использую in_array() и array_key_exist(), чтобы избежать дублирования значений.

Если анализируемый массив имеет вложенный массив, я вызываю функцию check(), передавая: nested массив, уровень, которого я достиг, levelKeys.

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