我有一个从字符串创建多维数组的函数。以下是每个字符串的输出外观:
字符串:
app.name.version
app.vendor
注意:这些是从数据库中检索的字符串
输出:
['app']['name']['version']
['app']['vendor']
我相应地为它们分配值。当我在字符串中包含表示子数组索引号的数字时,就会出现问题。下面是一个示例:
shifts.breaks.unpaid.0.description
shifts.breaks.unpaid.0.duration
shifts.breaks.unpaid.1.description
shifts.breaks.unpaid.1.duration
带输出:
Array
(
[unpaid] => Array
(
[0] => Array
(
[description] => Lunch
)
[1] => Array
(
[duration] => 30
)
[3] => Array
(
[description] => Lunch 2
)
[4] => Array
(
[duration] => 30
)
)
)
它通常应该看起来像:
Array
(
[unpaid] => Array
(
[0] => Array
(
[description] => Lunch
[duration] => 30
)
[1] => Array
(
[description] => Lunch 2
[duration] => 30
)
)
)
唯一可以解决这个问题的是,如果我用数字以外的任何数字替换数字,如下所示:
shifts.breaks.unpaid.b0.description
shifts.breaks.unpaid.b0.duration
shifts.breaks.unpaid.b1.description
shifts.breaks.unpaid.b1.duration
Array
(
[unpaid] => Array
(
[b0] => Array
(
[description] => Lunch
[duration] => 30
)
[b1] => Array
(
[description] => Lunch 2
[duration] => 30
)
)
)
下面是创建数组的函数:
function toArray($keys, $value){
$array = array();
$ref = &$array;
while(count($keys) > 0){
$n = array_shift($keys);
if(!is_array($ref))
$ref = array();
$ref = &$ref[$n];
}
$ref = $value;
return $array;
}
其中$keys
包含$keys = explode('.', "my.testing.string");
,这是我一直在使用的示例:
$strings = array (
"app.names.0.first"=> "Samuel",
"app.names.0.last"=> "Smith",
"app.names.1.first" => "Mary",
"app.names.2.last" =>"Kubik"
);
$list = array();
foreach($strings as $key => $name) {
$list[] = (toArray(explode('.', $key),$name));
}
print_r(call_user_func_array('array_merge_recursive', $list));
在这一点上,我不太确定这是否与array_merge_recursive
有关。纠正此问题的任何帮助都会很棒!
我发现的一个解决方案是在不覆盖数字键的情况下重写一个新的array_merge_recursive
函数。
function array_merge_recursive_new() {
$arrays = func_get_args();
$base = array_shift($arrays);
foreach ($arrays as $array) {
reset($base); //important
while (list($key, $value) = @each($array)) {
if (is_array($value) && @is_array($base[$key])) {
$base[$key] = array_merge_recursive_new($base[$key], $value);
} else {
$base[$key] = $value;
}
}
}
return $base;
}
感谢php.net
上的用户.当键为数字时,这将产生正确的输出。