Массив в многомерный массив ... на основе foo.bar.baz-dots в имени ключа массива - PullRequest
0 голосов
/ 10 июля 2011

У меня есть массив с "foo.bar.baz" в качестве имен ключей в массиве. Есть ли удобный способ превратить этот массив в многомерный массив (используя каждый «уровень точки» в качестве ключа для следующего массива)?

  • Фактический вывод: Array ([foo.bar.baz] => 1, [qux] => 1)
  • Желаемый вывод: Array ([foo] [bar] [baz] => 1, [qux] => 1)

Пример кода:

$arr = array("foo.bar.baz" => 1, "qux" => 1);
print_r($arr);

1 Ответ

3 голосов
/ 10 июля 2011

Решение:

<?php

$arr = array('foo.bar.baz' => 1, 'qux' => 1);

function array_dotkey(array $arr)
{
  // Loop through each key/value pairs.
  foreach ( $arr as $key => $value )
  {
    if ( strpos($key, '.') !== FALSE )
    {
      // Reference to the array.
      $tmparr =& $arr;

      // Split the key by "." and loop through each value.
      foreach ( explode('.', $key) as $tmpkey )
      {
        // Add it to the array.
        $tmparr[$tmpkey] = array();

        // So that we can recursively continue adding values, change $tmparr to a reference of the most recent key we've added.
        $tmparr =& $tmparr[$tmpkey];
      }

      // Set the value.
      $tmparr = $value;

      // Remove the key that contains "." characters now that we've added the multi-dimensional version.
      unset($arr[$key]);
    }
  }

  return $arr;
}

$arr = array_dotkey($arr);
print_r($arr);

Выходы:

Array
(
    [qux] => 1
    [foo] => Array
        (
            [bar] => Array
                (
                    [baz] => 1
                )

        )

)
...