我正试图创建一个包含配置文件的数组,但当一些键的名称相同时,我遇到了问题。假设我有一个这种格式的配置:
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,尽管它使用了对象结构。)