/ / मैक्रो (लारवेल) में एक डॉट नोटेशन संस्करण के लिए एक बहुआयामी संग्रह (सरणी) को कैसे समतल करना है? - php, सरणियाँ, लार्वा, पुनरावृत्ति, बहुआयामी-सरणी

मैक्रो (लैरावेल) में एक डॉट नोटेशन संस्करण में एक बहुआयामी संग्रह (सरणी) को कैसे फ़्लैट करें? - PHP, सरणी, लार्वेल, रिकर्सन, बहुआयामी-सरणी

उदाहरण 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 ....

});

उत्तर:

उत्तर № 1 के लिए 4

जिस चीज़ को आप करने की कोशिश कर रहे हैं उसे डॉट नोटेशन के साथ एक बहुआयामी सरणी को सरणी में बदलना कहा जाता है।

आप पहिया को सुदृढ़ करने की आवश्यकता नहीं करते हैं, लारवेल इसके लिए पहले से ही एक सहायक है, जिसे कहा जाता है array_dot ().

The array_dot फ़ंक्शन एक बहु-आयामी सरणी को सपाट करता है एकल स्तर की सरणी जो गहराई को इंगित करने के लिए "डॉट" नोटेशन का उपयोग करती है:

$ सरणी = ["उत्पादों" => ["डेस्क" => ["मूल्य" => 100]]];

$ चपटा = array_dot ($ array);

// ["products.desk.price" => 100]

आपको केवल अपने json को सरणी के साथ बदलना होगा json_decode() और फिर इसके साथ समतल करें array_dot() डॉट नोटेशन के साथ एक सरणी प्राप्त करने के लिए।