PHP 7.2 के लिए अद्यतन किया गया
PHP 7.2 ने ऑब्जेक्ट और एरे कास्ट्स में संख्यात्मक कुंजियों को परिवर्तित करने के लिए एक व्यवहारिक परिवर्तन की शुरुआत की , जो इस विशेष असंगतता को ठीक करता है और निम्नलिखित सभी उदाहरणों को अपेक्षित रूप से व्यवहार करता है।
एक कम बात भ्रमित होने की!
मूल उत्तर (7.2.0 से पहले के संस्करणों पर लागू होता है)
PHP में अंधेरे गलियों का हिस्सा है जो आप वास्तव में खुद को अंदर नहीं ढूंढना चाहते हैं। नाम के साथ ऑब्जेक्ट गुण जो संख्याएं हैं उनमें से एक है ...
जो उन्होंने आपको कभी नहीं बताया
तथ्य # 1: आप उन नामों के साथ संपत्तियों तक नहीं पहुंच सकते हैं जो आसानी से कानूनी चर नाम नहीं हैं
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->123foo;
तथ्य # 2: आप ऐसे गुणों को कर्ली ब्रेस सिंटैक्स के साथ एक्सेस कर सकते हैं
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'};
तथ्य # 3: लेकिन ऐसा नहीं है यदि संपत्ति का नाम सभी अंक है!
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
echo $o->{'123foo'};
echo $o->{'123'};
जीवंत उदाहरण ।
तथ्य # 4: ठीक है, जब तक कि वस्तु पहली जगह में एक सरणी से नहीं आई थी।
$a = array('123' => '123');
$o1 = (object)$a;
$o2 = new stdClass;
$o2->{'123'} = '123';
echo $o1->{'123'};
echo $o2->{'123'};
जीवंत उदाहरण ।
बहुत सहज, क्या आप सहमत नहीं हैं?
आप क्या कर सकते है
विकल्प # 1: इसे मैन्युअल रूप से करें
सबसे व्यावहारिक दृष्टिकोण बस उस वस्तु को डालना है जिसे आप एक सरणी में वापस रुचि रखते हैं, जो आपको गुणों तक पहुंचने की अनुमति देगा:
$a = array('123' => '123', '123foo' => '123foo');
$o = (object)$a;
$a = (array)$o;
echo $o->{'123'};
echo $a['123'];
दुर्भाग्य से, यह पुनरावर्ती रूप से काम नहीं करता है। तो आपके मामले में आपको कुछ करने की ज़रूरत है:
$highlighting = (array)$myVar->highlighting;
$data = (array)$highlighting['448364']->Data;
$value = $data['0'];
विकल्प # 2: परमाणु विकल्प
एक वैकल्पिक दृष्टिकोण एक फ़ंक्शन लिखने के लिए होगा जो ऑब्जेक्ट्स को आवर्ती रूप से सरणियों में परिवर्तित करता है:
function recursive_cast_to_array($o) {
$a = (array)$o;
foreach ($a as &$value) {
if (is_object($value)) {
$value = recursive_cast_to_array($value);
}
}
return $a;
}
$arr = recursive_cast_to_array($myVar);
$value = $arr['highlighting']['448364']['Data']['0'];
हालाँकि, मुझे यकीन नहीं है कि यह बोर्ड भर में एक बेहतर विकल्प है क्योंकि यह अनावश्यक रूप से उन सभी गुणों को गिरफ्तार करने के लिए डाली जाएगी जिनकी आप रुचि नहीं रखते हैं।
विकल्प # 3: इसे चालाक खेलना
पिछले विकल्प का एक विकल्प अंतर्निहित JSON फ़ंक्शन का उपयोग करना है:
$arr = json_decode(json_encode($myVar), true);
$value = $arr['highlighting']['448364']['Data']['0'];
JSON फ़ंक्शन किसी भी बाहरी फ़ंक्शन को परिभाषित करने की आवश्यकता के बिना सरणी के लिए पुनरावर्ती रूपांतरण करने में मदद करता है। हालांकि वांछनीय यह दिखता है, इसमें विकल्प # 2 का "परमाणु" नुकसान है और इसके अलावा नुकसान यह है कि यदि आपकी वस्तु के अंदर कोई तार है, तो उन तारों को UTF-8 (यह एक आवश्यकता है json_encode
) में एन्कोड किया जाना चाहिए ।