PHP - Автоматическое создание многомерного массива - PullRequest
2 голосов
/ 22 августа 2010

Итак, вот ввод:

$in['a--b--c--d'] = 'value';

И желаемый вывод:

$out['a']['b']['c']['d'] = 'value';

Есть идеи?Я попробовал следующий код без удачи ...


$in['a--b--c--d'] = 'value';
// $str = "a']['b']['c']['d";
$str = implode("']['", explode('--', key($in)));
${"out['$str']"} = 'value';

Ответы [ 2 ]

8 голосов
/ 22 августа 2010

Это похоже на главного кандидата на рекурсию.

Базовый подход выглядит примерно так:

  1. создать массив ключей
  2. создать массив для каждого ключа
  3. если ключей больше нет, вернуть значение (вместо массива)

Рекурсия, приведенная ниже, делает именно это, во время каждого вызова создается новый массив, первый ключ в списке назначается в качестве ключа для нового значения. На следующем шаге, если остаются ключи, процедура повторяется, но если ключей не осталось, мы просто возвращаем значение.

$keys = explode('--', key($in));

function arr_to_keys($keys, $val){
    if(count($keys) == 0){
        return $val;
    }
    return array($keys[0] => arr_to_keys(array_slice($keys,1), $val));
}

$out = arr_to_keys($keys, $in[key($in)]);

Для вашего примера приведенный выше код будет оцениваться как нечто эквивалентное этому (но будет работать для общего случая любого количества -- разделенных элементов):

$out = array($keys[0] => array($keys[1] => array($keys[2] => array($keys[3] => 'value'))));

Или, в более определенном смысле, он строит следующее:

$out = array('a' => array('b' => array('c' => array('d' => 'value'))));

Что позволяет вам получить доступ к каждому подмассиву через нужные вам индексы.

1 голос
/ 14 апреля 2011
$temp = &$out = array();
$keys = explode('--', 'a--b--c--d');
foreach ($keys as $key) {
    $temp[$key] = array();    
    $temp = &$temp[$key];
}
$temp = 'value';
echo $out['a']['b']['c']['d']; // this will print 'value'

В приведенном выше коде я создаю массив для каждого ключа и использую $ temp для ссылки на последний созданный массив.Когда у меня заканчиваются ключи, я заменяю последний массив фактическим значением.Обратите внимание, что $ temp - это ССЫЛКА на последний созданный, наиболее вложенный массив.

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