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