एक्सेस सरणी php में एक फंक्शन द्वारा लौटी है


88

मैं एक टेम्पलेट इंजन का उपयोग कर रहा हूं जो मेरी साइट में कोड सम्मिलित करता है जहां मैं चाहता हूं।

मैंने एक ऐसी चीज़ के लिए परीक्षण करने के लिए एक फ़ंक्शन लिखा है जो काफी आसान है:

myfunction() { return '($this->data["a"]["b"] ? true : false)'; }

समस्या यह है, $ यह-> डेटा निजी है, और मैं इसे हर जगह एक्सेस नहीं कर सकता, इसलिए मुझे गेटडाटा () का उपयोग करना होगा; जो मेरी समस्या का कारण बनता है।

$this->getData()['a']['b']

काम नहीं करता है, और पहले मान निर्दिष्ट करना या तो नहीं है क्योंकि इसका उपयोग सीधे अगर () ब्लॉक में किया जाएगा।

कोई विचार?


रिटर्न वैल्यू असाइन करना निश्चित रूप से काम करता है और एकमात्र तरीका है। क्या आप हमें अपना गैर-कार्य कोड दिखा सकते हैं?
एंटी वीराना

वैसे यह काम नहीं करता है क्योंकि कोड अगर (/ * कोड यहाँ * /) में डाला जाएगा। इसलिए मैं पहले सिर्फ डेटा असाइन नहीं कर सकता।
enyo

1
आप पृथ्वी पर वैसे भी क्या बना रहे हैं? :) eval के साथ कुछ?
वीराना

आप क्या जाँचने की कोशिश कर रहे हैं? क्या आप यह देखने की कोशिश करते हैं कि क्या एरे तत्व मौजूद है और गैर-रिक्त मान है? आप इसके लिए 'खाली' फ़ंक्शन का उपयोग कर सकते हैं। इस प्रश्न को और अधिक स्पष्टता की आवश्यकता है!
txwikinger 12

वह (स्ट्रिंग) वह स्ट्रिंग मान कैसे है जिसे आप myfunction()आगे संसाधित करते हैं? आपके प्रश्न में वह हिस्सा गायब है।
हक्रे

जवाबों:


134

PHP 5.4 के बाद से यह बिल्कुल संभव है:

getSomeArray()[2]

संदर्भ: https://secure.php.net/manual/en/language.types.array.php#ample/62

PHP 5.3 या इससे पहले, आपको एक अस्थायी चर का उपयोग करना होगा।


4
मुझे मिल गया है PHP 5.4.11-1~precise+1और यह सुविधा काम नहीं करती है! जवाब में संदेश मिलाParse error: syntax error, unexpected '['
यूजीन

1
+ यूजीन क्या आपको यह काम कर रहा है? हो सकता है कि अन्य लोग भी इसी समस्या का अनुभव करें।
enyo

2
यह php 5.4 तक लिया गया था, एरे फ़ंक्शंस से लौटे हुए अंकन का समर्थन करने के लिए ?! क्या एक बुरा बग।
तुलसी मूसा

और फिर आप array_filter द्वारा उत्पन्न एक सरणी के पहले तत्व को प्राप्त करने की कोशिश करते हैं और रोना शुरू करते हैं
Loupax

17

आप इस तरह से कुछ का उपयोग नहीं कर सकते हैं:

$this->getData()['a']['b']

यानी, अरै-एक्सेस सिंटैक्स एक फंक्शन-कॉल पर सीधे संभव नहीं है।

आपको कुछ अस्थायी चर का उपयोग करना होगा , जैसे:

$tmp = $this->getData();
$tmp['a']['b']    // use $tmp, now

आपके मामले में, इसका संभवतः इस तरह से उपयोग करने का मतलब है:

function myfunction() {
  $tmp = $this->getData();
  return ($tmp['a']['b'] ? true : false);
}

आपको करना होगा :

  • सबसे पहले, अपनी getData()विधि को बुलाओ , और एक अस्थायी varibale में इसके वापसी मूल्य को संग्रहीत करें
  • फिर, अपने परीक्षण के लिए उस अस्थायी चर का उपयोग करें

आपके पास वास्तव में इसके बारे में ज्यादा विकल्प नहीं हैं ...


ठीक है, जैसा कि मैंने कहा, मेरी समस्या यह है कि यह कोड डाला जाता है, सीधे अगर (/ * कोड यहाँ जाता है * /) तो एक फ़ंक्शन को परिभाषित करना वास्तव में संभव नहीं है ...
enyo

क्या आप if स्टेटमेंट से पहले किसी वैरिएबल को मेथड कॉल के परिणाम को असाइन नहीं कर सकते हैं, और उस स्टेटमेंट को इफ स्टेटमेंट से सीधे कॉल करने की कोशिश करने के बजाय, यदि उस स्टेटमेंट में उपयोग करते हैं?
पास्कल मार्टिन

1
दुर्भाग्य से नहीं ... यह एक अस्थायी इंजन है, और मेरा इस पर कोई नियंत्रण नहीं है।
enyo

12

ठीक है ... जाहिरा तौर पर वास्तव में एक बेहतर तरीका नहीं है, इसलिए मैं अपने आप को एक बहुत सुंदर समाधान के साथ जवाब देने जा रहा हूं:

मैंने फंक्शन बनाया:

arrayGet($array, $index) { return $array[$index]; }

और इसे इस तरह इस्तेमाल किया:

myfunction() { return '(arrayGet(arrayGet($this, "a"), "b") ? true : false)' }

यह सुंदर नहीं है, लेकिन काम करता है।


1

$this->dataहै हमेशा अगर यह सुरक्षित है, सुलभ। हर जगह से सुलभ नहीं है, इसलिए यदि आप अपने कोड में लौट रहे हैं , और इसका मूल्यांकन इस तरह किया जाता है, तो यह ठीक होना चाहिए।$object->data$this

Btw, आपके कोड में एक बग है: उद्धरण से बचने की आवश्यकता है।

myfunction() { return '($this->data[\'a\'][\'b\'] ? true : false)'; }

हाँ क्षमा करें ... मैंने अपनी पोस्ट को सही किया: $ यह-> डेटा निजी तौर पर है। बग बनाते समय मेरे टाइपो को भी ठीक किया।
enyo

1

यह PHP संस्करण 5.4 से संभव है।

आप एक अस्थायी चर नहीं चाहते हैं उस के लिए और अपने PHP संस्करण कम है, 5.4 से , की तुलना में आप अभी भी प्रथम या अंतिम तत्व प्राप्त करने के कुछ कार्यों में बनाया का उपयोग कर सकते हैं:

$x     = 'first?last';
$first = array_shift(explode('?', $x));
$last  = end(explode('?', $x));
$last2 = array_pop(explode('?', $x));

संपादित करें: !!! कृपया ध्यान दें, कि बाद के संस्करणों (5.4+) में PHP एक नोटिस फेंक देगी, क्योंकि अंत में केवल चर के रूप में पैरामीटर की उम्मीद है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.