JSON格式的示例输入
{
"user":{
"name":"Thomas",
"age":101
},
"shoppingcart":{
"products":{
"p1":"someprod",
"p2":"someprod2"
},
"valuta":"eur",
"coupon":null,
"something":[
"bla1",
"bla2"
]
}
}
期望输出结果
[
'user.name' => 'Thomas',
'user.age' => 101,
'shoppingcart.products.p1' => 'someprod',
...
'shoppingcart.something.1' => 'bla1'
]
我写了这个函数,但它输出的结果是错误的。此外,我想把这个函数重写成Collection
的宏,但我无法理解它。问题还在于当前的函数需要一个全局变量来跟踪结果。
public function dotFlattenArray($array, $currentKeyArray = []) {
foreach ($array as $key => $value) {
$explodedKey = preg_split('/[^a-zA-Z]/', $key);
$currentKeyArray[] = end($explodedKey);
if (is_array($value)) {
$this->dotFlattenArray($value, $currentKeyArray);
} else {
$resultArray[implode('.', $currentKeyArray)] = $value;
array_pop($currentKeyArray);
}
}
$this->resultArray += $resultArray;
}
我的问题有两个: 1. 有时函数不能给出正确的结果 2. 我该如何将这个递归函数改写成宏
Collection::macro('dotflatten', function () {
return ....
});