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



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

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("/nr|rn|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;分配会覆盖条目。对于这种情况,优选array_merge。CCD_ 3也未定义;不知道它是从哪里来的。

另一个简化就是使用= &$last[$key]遍历数组结构。这隐式地定义了子数组。但是你当然可以保留isset或者使用settype来显式。

$config = array();
$filehandle = @fopen(2, "r");
while (!feof($filehandle))
{
    $line           = ereg_replace("/nr|rn|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);

顺便说一句,ereg函数有些过时了。您可以使用单个preg_match_all来简化这一点,或者使用parse_ini_file更好地读取ini样式的文件(请参阅这里的类似答案php parse_ini_file oop&deep,尽管它使用了对象结构。)

相关内容

  • 没有找到相关文章

最新更新