2008-08-16 13 views
47

PHP में, मुझे अक्सर एक सरणी का उपयोग करके एक चर को मैप करने की आवश्यकता होती है ... लेकिन मैं इसे एक लाइनर में ऐसा करने में सक्षम नहीं लग रहा हूं। सी.एफ़ उदाहरण:PHP: फ्लाई पर पहुंच ऐरे वैल्यू

// the following results in an error: 
echo array('a','b','c')[$key]; 

// this works, using an unnecessary variable: 
$variable = array('a','b','c'); 
echo $variable[$key]; 

यह एक छोटी सी समस्या है, लेकिन यह एक समय में एक बार हर गुस्सा दिलाना रहता है ... मैं इस तथ्य पसंद नहीं है, कि मैं कुछ नहीं के लिए एक चर का उपयोग करें;)

+4

<= v5.3' –

उत्तर

15

मैं wouldn वास्तव में उस अतिरिक्त चर के बारे में परेशान नहीं है। यदि आप चाहते हैं, हालांकि, आप भी यह स्मृति से के बाद आप का उपयोग किया है इसे हटाने सकता है:

$variable = array('a','b','c'); 
echo $variable[$key]; 
unset($variable); 

या, आप एक छोटे से समारोह लिख सकते हैं:

function indexonce(&$ar, $index) { 
    return $ar[$index]; 
} 

और के साथ इस फोन:

$something = indexonce(array('a', 'b', 'c'), 2); 

सरणी स्वचालित रूप से नष्ट होनी चाहिए।

+0

@onnodb, 'सख्त मानक: केवल चर के लिए reference' द्वारा पारित किया जाना चाहिए आपका फ़ंक्शन 'इंडेक्सनसे''। आप '&' संदर्भ क्यों जोड़ते हैं? – Pacerier

38

तकनीकी जवाब है कि व्याकरण PHP भाषा की केवल चर भाव के अंत पर सबस्क्रिप्ट अंकन और सामान्य रूप में नहीं भाव की अनुमति देता है, जो है कि यह कैसे सबसे अन्य भाषाओं में काम करता है। मैंने हमेशा इसे भाषा में कमी के रूप में देखा है, क्योंकि एक व्याकरण होना संभव है जो किसी भी अभिव्यक्ति के खिलाफ सब्सक्रिप्शन को हल करता है। हालांकि, यह मामला हो सकता है कि वे एक लचीला पार्सर जनरेटर का उपयोग कर रहे हैं या वे बस कुछ प्रकार की पिछली संगतता को तोड़ना नहीं चाहते हैं।

यहां मान्य भाव पर अवैध सबस्क्रिप्ट के कुछ और उदाहरण हैं:

$x = array(1,2,3); 
print ($x)[1]; //illegal, on a parenthetical expression, not a variable exp. 

function ret($foo) { return $foo; } 
echo ret($x)[1]; // illegal, on a call expression, not a variable exp. 
+2

कम से कम दूसरे वाक्यविन्यास के लिए एक परिवर्तन प्रस्ताव था, लेकिन इसे अस्वीकार कर दिया गया था: http://wiki.php.net/rfc/functionarraydereferencing – Max

+11

स्थिति अब स्वीकार की गई है http://wiki.php.net/rfc/ functionarraydereferencing –

+3

यह उत्तर अब सटीक नहीं है। 5.5 के रूप में, PHP निरंतर/सरणी/स्ट्रिंग dereference का समर्थन करता है https://wiki.php.net/rfc/constdereference – Mbrevda

0

या कुछ इस तरह, यदि आप एक चर

$variable = array('a','b','c'); 
$variable = $variable[$key]; 
1

वास्तव में सरणी मूल्य की जरूरत है, वहाँ एक है सुरुचिपूर्ण समाधान :) निम्नलिखित myfunc द्वारा $ myvun में लौटाए गए सरणी के तीसरे तत्व को आवंटित करेगा:

$myvar = array_shift(array_splice(myfunc(),2)); 
+8

चालाक? हाँ! सुरुचिपूर्ण? नहीं। –

2
function doSomething() 
{ 
    return $somearray; 
} 

echo doSomething()->get(1)->getOtherPropertyIfThisIsAnObject(); 
+0

आप सरणी पर '(1) 'कैसे प्राप्त कर सकते हैं? घातक त्रुटि: किसी सदस्य फ़ंक्शन पर कॉल करें() लाइन 21 – Pacerier

23

इसे सर डेरफ़्रेंसिंग कहा जाता है। इसे PHP 5.4 में जोड़ा गया है। http://www.php.net/releases/NEWS_5_4_0_alpha1.txt

अद्यतन [2012-11-25]: पीएचपी 5.5 के रूप में, अपसंदर्भन contants/तार के साथ-साथ सरणियों

5

यह सीधे संबंधित नहीं किया जा सकता करने के लिए जोड़ दिया गया है .. लेकिन मैं के लिए आया था इस पोस्ट को इस विशिष्ट समस्या का समाधान मिल रहा है।

मुझे निम्नलिखित फ़ॉर्म में एक फ़ंक्शन से परिणाम मिला।

Array 
(
    [School] => Array 
      (
       [parent_id] => 9ce8e78a-f4cc-ff64-8de0-4d9c1819a56a 
      ) 
) 

मैं क्या चाहता था PARENT_ID मूल्य "9ce8e78a-f4cc-ff64-8de0-4d9c1819a56a" था। मैंने इस तरह के फ़ंक्शन का उपयोग किया और इसे प्राप्त किया।

array_pop(array_pop(the_function_which_returned_the_above_array())) 

तो, यह एक पंक्ति में किया गया था :) आशा है कि यह किसी के लिए मददगार होगा।

+0

पर file.php में एक गैर-ऑब्जेक्ट पर प्राप्त करें) यह केवल अंतिम मान पर काम करता है, और आप ** मूल सरणी ** से मान निकाल देंगे। – Pacerier

0

आप के साथ आ सकता है, php का उपयोग कर array_ * कार्यों वहाँ कई oneliners हैं। लेकिन मैं आपको आश्वस्त करता हूं कि ऐसा करने से आप जो हासिल करना चाहते हैं उसकी तुलना में यह कुल अनावश्यक है।

उदाहरण आप निम्न की तरह कुछ उपयोग कर सकते हैं, लेकिन यह एक सुरुचिपूर्ण समाधान नहीं है और मुझे इसके प्रदर्शन के बारे में निश्चित नहीं है;

array_pop (array_filter(array_returning_func(), function($key){ return $key=="array_index_you_want"? TRUE:FALSE; },ARRAY_FILTER_USE_KEY)); 

यदि आप एक php ढांचे का उपयोग कर रहे हैं और आप php के एक पुराने संस्करण के साथ फंस रहे हैं, सबसे चौखटे पुस्तकालयों की मदद की है।

उदाहरण: Codeigniter सरणी सहायकों

`पीएचपी v5.4`,` PHP में अवैध वाक्य रचना के रूप में काम करता है
संबंधित मुद्दे