[英]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.