簡體   English   中英

PHP:具有N個元素的動態多維數組

[英]PHP: Dynamic multidimensional array with N number of 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

並且可以將其轉換為這樣的數組,即可以有任意數量的逗號分隔鍵值:

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; 分配將覆蓋條目。 對於這種情況,首選array_merge 而且$head是未定義的; 不知道它是從哪里來的。

另一個簡化就是使用= &$last[$key]遍歷數組結構。 這隱含地定義了子數組。 但是您當然可以保留isset或明確使用settype

$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);

順便說一句, ereg功能有些過時了。 您可以使用單個preg_match_all或更好地使用parse_ini_file讀取 ini 樣式文件來簡化這一點。 - (在此處查看類似的答案php parse_ini_file oop & deep ,盡管它使用 object 結構。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM