/ / Ako zlúčiť multidimenzionálnu kolekciu (pole) do verzie notového záznamu v makre (Laravel)? - php, polia, larvy, rekurzie, viacrozmerné polia

Ako sploštiť viacrozmernú kolekciu (pole) na verziu s notovým zápisom v makre (Laravel)? - php, polia, larvy, rekurzia, viacrozmerné pole

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ď č. 1

To, č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.