Príklad vstupu ako json
{
"user":{
"name":"Thomas",
"age":101
},
"shoppingcart":{
"products":{
"p1":"someprod",
"p2":"someprod2"
},
"valuta":"eur",
"coupon":null,
"something":[
"bla1",
"bla2"
]
}
}
Očakávaný výkon
[
"user.name" => "Thomas",
"user.age" => 101,
"shoppingcart.products.p1" => "someprod",
...
"shoppingcart.something.1" => "bla1"
]
Túto funkciu som napísal, ale vytvára nesprávny výstup. Ďalej by som chcel prepísať uvedenú funkciu do makra pre Collection
ale nemôžem omotať hlavu okolo. Problém je tiež v tom, že súčasná funkcia tak, ako je, si vyžaduje globálny var na sledovanie výsledku.
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;
}
Môj problém je teda dvojaký: 1. Niekedy funkcia nedáva správny výsledok 2. Ako môžem prepísať túto rekurzívnu funkciu na makro
Collection::macro("dotflatten", function () {
return ....
});
odpovede:
4 pre odpoveď č. 1To, čo sa snažíte urobiť, sa nazýva transformácia multidimenzionálneho poľa na pole pomocou bodového zápisu.
Nemusíte znovu vynájsť koleso, Laravel už má za to pomocníka, zvaný array_dot ().
Na array_dot Funkcia vyrovnáva viacrozmerné pole do a jednoúrovňové pole, ktoré používa na označenie hĺbky zápis „bodka“:
$ array = ["products" => ["desk" => ["price" => 100]]];
$ flattened = array_dot ($ array);
// ["products.desk.price" => 100]
Potrebujete iba transformovať svoje json na pole pomocou json_decode()
a potom ho naplocho array_dot()
získať pole s bodovým zápisom.