PHP:具有N个元素的动态多维数组

PHP:具有N个元素的动态多维数组,php,dynamic,random,multidimensional-array,elements,Php,Dynamic,Random,Multidimensional Array,Elements,我试图创建一个包含配置文件的数组,但当某些键具有相同的名称时,我遇到了问题。假设我有一个这种格式的配置: dinner=salad dish.fruit.first.name=apple dish.fruit.first.juicy=true dish.fruit.second.name=lettuce dish.fruit.second.juicy=false dressing.name=french dressing.tasty=true 这将变成这样的数组,可以有任意数量的逗号分隔的键值

我试图创建一个包含配置文件的数组,但当某些键具有相同的名称时,我遇到了问题。假设我有一个这种格式的配置:

dinner=salad
dish.fruit.first.name=apple
dish.fruit.first.juicy=true
dish.fruit.second.name=lettuce
dish.fruit.second.juicy=false
dressing.name=french
dressing.tasty=true
这将变成这样的数组,可以有任意数量的逗号分隔的键值:

Array
(
  [dinner] => "salad"
  [dish] => Array
  (
    [fruit] => Array
    (
      [first] => Array
      (
        [name] => "apple"
        [juicy] => "true"
      )
      [second] => Array
      (
        [name] => "lettuce"
        [juicy] => "false"
      )
    )
  )
  [dressing] => Array
  (
    [name] => "french"
    [tasty] => "true"
  )
)
但我无法控制它。我尝试创建一个foreach循环,并通过引用将新数组插入最后一个数组,但它只需要以相同名称开头的第一个键集。以下是我当前的代码和结果:

    $config = array();
    $filehandle = @fopen($filename, "r");
    while (!feof($filehandle))
    {
        $line           = ereg_replace("/\n\r|\r\n|\n|\r/", "", fgets($filehandle, 4096));
        $configArray    = explode("=", $line);
        $configKeys     = explode(".", $configArray[0]);
        $configValue    = $configArray[1];

        foreach ($configKeys as $key)
        {
            if (isset($head))
            {
                $last[$key] = array();
                $last = &$last[$key];
            }
            else
            {
                $head[$key] = array();
                $last = &$head[$key];
            }
        }
        $last = $configValue;
        $config += $head;
        unset($head);
        unset($last);
    }
    fclose($filehandle);
结果:

Array
(
  [dinnes] => "salad"
  [dish] => Array
  (
    [fruit] => Array
    (
      [first] => Array
      (
        [name] => "apple"
      )
    )
  )
  [dressing] => Array
  (
    [name] => "french"
  )
)

这里面有各种各样的问题

$config+=$head分配将覆盖条目。在这种情况下,我更喜欢。而且,
$head
未定义;不知道它是从哪里来的

另一种简化方法是使用
=&$last[$key]
遍历数组结构。这隐式地定义了子阵列。但是,您当然可以保留或用于明确性

$config = array();
$filehandle = @fopen(2, "r");
while (!feof($filehandle))
{
    $line           = ereg_replace("/\n\r|\r\n|\n|\r/", "", fgets($filehandle, 4096));
    $configArray    = explode("=", $line);
    $configKeys     = explode(".", $configArray[0]);
    $configValue    = $configArray[1];

    $last = &$config;
    foreach ($configKeys as $key)
    {
            $last = &$last[$key];
    }
    $last = $configValue;

}
fclose($filehandle);

顺便说一句,这些功能有些过时。您可以使用一个或更好的方法在ini样式文件中使用-(请参见此处的类似答案,尽管它使用了对象结构。)

您是否考虑过配置文件的不同格式?一个JSON对象将是微不足道的。热diggity,谢谢!是的,我现在明白了。我知道有更简单的解决办法:P