示例输入为 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 ....
});
您想要做的事情称为将多维数组转换为带有点表示法的数组。
你不需要重新发明轮子,Laravel 已经有一个助手了,叫做 array_dot()。
array_dot函数将多维数组展平为 使用“点”表示法表示深度的单级数组:
$array = ['产品' => ['办公桌' => ['价格' => 100]]];
$展平 = array_dot($array);
// ['products.desk.price' => 100]
您只需使用
json_decode()
将 json 转换为数组,然后使用 array_dot()
将其展平即可获得带有点表示法的数组。
Laravel 有一个集合方法,可以将多维结构转换为带有点分隔键的扁平结构 --
dot()
。
代码:(PHPize演示)
$json = '{
"user":{
"name":"Thomas",
"age":101
},
"shoppingcart":{
"products":{
"p1":"someprod",
"p2":"someprod2"
},
"valuta":"eur",
"coupon":null,
"something":[
"bla1",
"bla2"
]
}
}';
var_export(
collect(json_decode($json, true))
->dot()
->toArray()
);
输出:
array (
'user.name' => 'Thomas',
'user.age' => 101,
'shoppingcart.products.p1' => 'someprod',
'shoppingcart.products.p2' => 'someprod2',
'shoppingcart.valuta' => 'eur',
'shoppingcart.coupon' => NULL,
'shoppingcart.something.0' => 'bla1',
'shoppingcart.something.1' => 'bla2',
)