Как инвертировать многомерный массив? - PullRequest
3 голосов
/ 22 ноября 2011

У меня есть массив с n элементами, каждый из которых содержит n дочерних элементов, каждый из которых содержит ...

Array
(
    [tea] => Array
        (
            [drink] => Array
                (
                    [food] => 
                )
        )
    [biscuits] => Array
        (
            [snack] => Array
                (
                    [food] => 
                )
        )
    ...
)

То, что я хочу сделать, - это иметь самый внутренний элемент снаружи и самые внешние элементы внутри:

Array
(
    [food] => Array
        (
            [drink] => Array
                (
                    [tea] => 
                )
            [snack] => Array
                )
                    [biscuits] => 
                (
        )
    ...
)

И решение должно быть в состоянии справиться с n дочерними массивами. Мне известно о Как инвертировать многомерный массив в PHP , но решения там не решили эту проблему.

1 Ответ

4 голосов
/ 22 ноября 2011

Я почти уверен, что это может быть сокращено в дальнейшем, но это делает работу:

function flatten(array $array) {
    $key = array(key($array));
    $val = current($array);
    if (is_array($val)) {
        $key = array_merge(flatten($val), $key);
    }
    return $key;
}

function build(array $path, array $result) {
    $key = array_shift($path);
    if (!isset($result[$key])) {
        $result[$key] = $path ? array() : null;
    }
    if ($path) {
        $result[$key] = build($path, $result[$key]);
    }
    return $result;
}

$result = array();
foreach ($array as $key => $value) {
    $result = build(flatten(array($key => $value)), $result);
}

Демо: http://codepad.org/rnZPdWGG

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