दिलचस्प पोस्ट
यदि onclick निष्पादित है मैं HREF कैसे अक्षम कर सकता हूँ? स्थिर-आकार के हिस्सेों में एक आवेश को कैसे विभाजित किया जाए ओरेकल के पोस्टग्रेज़ के बराबर का अंतर? PHP कुकी समस्या – www या बिना www Load_File काम नहीं करता है संग्रह कैसे करता है। सी में एक यादृच्छिक दशमलव बनाने अजगर: मेरी प्रतिलिपि चर में परिवर्तन मूल चर को प्रभावित करता है _JAVA_OPTIONS JAVA_TOOL_OPTIONS और JAVA_OPTS के बीच का अंतर अजगर और टंकिनर: एक कैनवास पर स्क्रॉलबार का उपयोग करना क्रिएट पर एंड्रॉइड सेवा को फोन किए बिना कई बार कहा जाता है सूची में सूची को कैसे ज़िप करना नाम से कक्षा को तत्काल? गिट धक्का का उपयोग करके एक प्रोजेक्ट को परिनियोजित करें Xcode 4 प्लगइन विकास

फ़ंक्शन परिणाम डिफरेंसिंग के लिए PHP सिंटैक्स

पृष्ठभूमि

हर दूसरे प्रोग्रामिंग भाषा में मैं नियमित आधार पर उपयोग करता हूं, फंक्शन के परिणाम को रोकने के लिए एक नया चर घोषित किए बिना फ़ंक्शन के रिटर्न वेल्यू पर काम करना आसान होता है।

PHP में, हालांकि, यह इतना आसान नहीं दिखता है:

example1 (फ़ंक्शन का परिणाम एक सरणी है)

<?php function foobar(){ return preg_split('/\s+/', 'zero one two three four five'); } // can php say "zero"? /// print( foobar()[0] ); /// <-- nope /// print( &foobar()[0] ); /// <-- nope /// print( &foobar()->[0] ); /// <-- nope /// print( "${foobar()}[0]" ); /// <-- nope ?> 

उदाहरण 2 (फ़ंक्शन परिणाम एक वस्तु है)

 <?php function zoobar(){ // NOTE: casting (object) Array() has other problems in PHP // see eg, http://stackoverflow.com/questions/1869812 $vout = (object) Array('0'=>'zero','fname'=>'homer','lname'=>'simpson',); return $vout; } // can php say "zero"? // print zoobar()->0; // <- nope (parse error) // print zoobar()->{0}; // <- nope // print zoobar()->{'0'}; // <- nope // $vtemp = zoobar(); // does using a variable help? // print $vtemp->{0}; // <- nope 

क्या कोई सुझाव दे सकता है कि यह PHP में कैसे करें?

Solutions Collecting From Web of "फ़ंक्शन परिणाम डिफरेंसिंग के लिए PHP सिंटैक्स"

यह विशेष रूप से सरणी डीरेंसिंग है, जो वर्तमान में php5.3 में असमर्थित है, लेकिन अगले रिलीज में संभव होना चाहिए, 5.4। ऑब्जेक्ट डीरफेंसिंग वर्तमान पीएचपी रिलीज में दूसरी संभव है। मैं भी इस कार्यक्षमता के लिए आगे देख रहा हूँ!

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

तो आपको करने की ज़रूरत है

 $var = foobar(); print($var[0]); 

एआरए Dereferencing PHP 5.4 के रूप में संभव है:

उदाहरण ( स्रोत ):

 function foo() { return array(1, 2, 3); } echo foo()[2]; // prints 3 

PHP 5.3 के साथ आपको मिलेगा

 Parse error: syntax error, unexpected '[', expecting ',' or ';' 

मूल उत्तर:

इससे पहले ही पूछा गया है जवाब न है। यह संभव नहीं है।

इस विषय पर एंडी गुटमों का उद्धरण :

यह एक सुप्रसिद्ध सुविधा अनुरोध है, लेकिन PHP 5.0 में समर्थित नहीं होगा। मैं आपको नहीं बता सकता कि क्या यह कभी भी समर्थित होगा। इसमें कुछ शोध और कई विचारों की आवश्यकता है

आप इस अनुरोध को कई बार PHP Bugtracker में प्राप्त कर सकते हैं। तकनीकी विवरण के लिए, मैं सुझाव देता हूं कि आप आधिकारिक आरएफसी की जांच करें और / या PHP इंटरनेशनल से पूछें।

ठीक है, आप निम्न समाधानों में से किसी भी स्थिति के आधार पर उपयोग कर सकते हैं:

 function foo() { return array("foo","bar","foobar","barfoo","tofu"); } echo(array_shift(foo())); // prints "foo" echo(array_pop(foo())); // prints "tofu" 

या आप सूची () का उपयोग करके लौटे हुए सरणी से विशिष्ट मान प्राप्त कर सकते हैं:

 list($foo, $bar) = foo(); echo($foo); // prints "foo" echo($bar); // print "bar" 

संपादित करें: प्रत्येक के लिए उदाहरण कोड () मैंने पहले दिया था गलत। प्रत्येक () एक महत्वपूर्ण मूल्य जोड़ी देता है तो यह foreach () का उपयोग करना आसान हो सकता है:

 foreach(foo() as $key=>$val) { echo($val); } 

दुर्भाग्य से ऐसा करने का कोई तरीका नहीं है, हालांकि यह अधिकांश अन्य प्रोग्रामिंग भाषाओं में है

यदि आप वास्तव में एक लाइनर करना चाहते थे, तो आप एक () नामक फ़ंक्शन बना सकते हैं और ऐसा कुछ कर सकते हैं

 $test = a(func(), 1); // second parameter is the key. 

लेकिन उस के अलावा, PHP () [1] PHP में समर्थित नहीं है

जैसा कि अन्य लोगों ने उल्लेख किया है, यह संभव नहीं है। PHP के वाक्यविन्यास इसे अनुमति नहीं देता है हालांकि, मेरे पास एक सुझाव है जो अन्य दिशा से समस्या पर हमला करता है।

यदि आप getBarArray विधि के नियंत्रण में हैं और PHP मानक पुस्तकालय (PHP PHP 5.2.X के साथ डिफ़ॉल्ट रूप से इंस्टॉल किए गए कई PHP पर स्थापित किए गए हैं) पर पहुंच प्राप्त कर रहे हैं तो आपको मूल PHP सरणी / संग्रह के बजाय एक ArrayObject लौटने पर विचार करना चाहिए। ArrayObjects में एक offetGet विधि है, जिसका उपयोग किसी भी सूचक को पुनः प्राप्त करने के लिए किया जा सकता है, इसलिए आपका कोड ऐसा कुछ दिखाई दे सकता है

 <?php class Example { function getBarArray() { $array = new ArrayObject(); $array[] = 'uno'; $array->append('dos'); $array->append('tres'); return $array; } } $foo = new Example(); $value = $foo->getBarArray()->offsetGet(2); 

और अगर आपको कभी भी मूल सरणी / संग्रह की ज़रूरत होती है, तो आप हमेशा परिणाम निकाल सकते हैं।

 //if you need $array = (array) $foo->getBarArray(); 

एक आवरण समारोह लिखें जो समान रूप से पूरा करेगा। PHP के आसान प्रकार-कास्टिंग के कारण यह बहुत ही खुला-समाप्त हो सकता है:

 function array_value ($array, $key) { return $array[$key]; } 

यदि आप केवल सरणी में पहली वस्तु वापस करना चाहते हैं, तो वर्तमान () फ़ंक्शन का उपयोग करें

 return current($foo->getBarArray()); 

http://php.net/manual/en/function.current.php

दरअसल, मैंने एक पुस्तकालय लिखा है जो इस तरह के व्यवहार की अनुमति देता है:

http://code.google.com/p/php-preparser/

सब कुछ के साथ कार्य करता है: कार्य, विधियां कैश, इसलिए ही PHP के रूप में तेजी से हो रहा है 🙂

आप पीएचपी में चेन अभिव्यक्ति नहीं कर सकते हैं, इसलिए आपको एक चर में array_test() के परिणाम को सहेजना होगा।

इसे इस्तेमाल करे:

 function array_test() { return array(0, 1, 2); } $array = array_test(); echo $array[0]; 

यह बहुत दूर है, लेकिन अगर आप वास्तव में इसे एक पंक्ति में रखना चाहते हैं:

 return index0( $foo->getBarArray() ); /* ... */ function index0( $some_array ) { return $some_array[0]; } 

आप निश्चित रूप से एक सरणी के बजाय एक ऑब्जेक्ट वापस कर सकते हैं और इसे इस तरह से पहुंच सकते हैं:

 echo "This should be 2: " . test()->b ."\n"; 

लेकिन मुझे यह एक सरणी के साथ करने की संभावना नहीं मिली 🙁

मेरे सामान्य कामकाज के लिए इस तरह एक सामान्य समारोह है

  function e($a, $key, $def = null) { return isset($a[$key]) ? $a[$key] : $def; } 

और फिर

  echo e(someFunc(), 'key'); 

एक बोनस के रूप में, यह आपको 'अपरिभाषित इंडेक्स' चेतावनी से बचा जाता है जब आपको इसकी आवश्यकता नहीं होती है।

कारणों में से क्यों foo()[x] काम नहीं कर रहा है, इसका उत्तर काफी असभ्य है और यहां प्रकाशित नहीं होने वाला है। 😉

ये आपकी समस्या से निपटने के कुछ तरीके हैं।

सबसे पहले आप चर का नाम बदल सकते हैं, यदि वे वेरिएबल्स को वापस देते हैं जो संग्रह का हिस्सा नहीं हैं, लेकिन प्रत्येक को अलग अर्थ है।

अन्य दो तरीके परिणाम लौटने के लिए हैं जो मूल्यों का एक संग्रह है।

 function test() { return array(1, 2); } list($a, $b) = test(); echo "This should be 2: $b\n"; function test2() { return new ArrayObject(array('a' => 1, 'b' => 2), ArrayObject::ARRAY_AS_PROPS); } $tmp2 = test2(); echo "This should be 2: $tmp2->b\n"; function test3() { return (object) array('a' => 1, 'b' => 2); } $tmp3 = test3(); echo "This should be 2: $tmp3->b\n"; 

अत्यंत यहूदी बस्ती, लेकिन, यह केवल PHP का उपयोग करके किया जा सकता है। यह लैम्ब्डा फ़ंक्शन का उपयोग करता है (जो PHP 5.3 में पेश किया गया था)। देखें और चकित हो (और, अहम, डरे हुए):

 function foo() { return array( 'bar' => 'baz', 'foo' => 'bar', } // prints 'baz' echo call_user_func_array(function($a,$k) { return $a[$k]; }, array(foo(),'bar')); 

अधिकतर अन्य भाषाओं में हमें कितनी सुंदर चीज़ों के माध्यम से जाना है

रिकॉर्ड के लिए, मैं नोलट के जैसा कुछ करता हूं। माफ करना, अगर मैंने किसी की आँखें खूनी हुईं

आगे शोध के बाद मेरा मानना ​​है कि इसका उत्तर नहीं है, एक अस्थायी चर ऐसा है जो फ़ंक्शन से लौटाए गए एक सरणी से निपटने के लिए वास्तव में वैधानिक तरीका है।

ऐसा लगता है कि यह PHP 5.4 में शुरू हो जाएगा।

इसके अलावा, यह उत्तर मूलतः इस प्रश्न के संस्करण के लिए था:

फ़ंक्शन से लौटाए सरणी का उपयोग करते समय PHP में अस्थायी चर से कैसे बचें

यदि यह सिर्फ सौंदर्यवादी है, तो ऑब्जेक्ट नोटेशन काम करेगा यदि आप कोई ऑब्जेक्ट वापस करेंगे। जहाँ तक मेमोरी प्रबंधन चला जाता है, कोई अस्थायी प्रतिलिपि नहीं बनाई गई है, केवल संदर्भ में बदलाव।

संक्षिप्त जवाब:

हाँ। PHP में फ़ंक्शन के रिटर्न वैल्यू पर काम करना संभव है, फ़ंक्शन का परिणाम और PHP का आपका विशिष्ट संस्करण इसका समर्थन करता है।

उदाहरण 2 का संदर्भ देता है:

 // can php say "homer"? // print zoobar()->fname; // homer <-- yup 

मामले:

  • फ़ंक्शन का परिणाम एक सरणी है और आपका PHP संस्करण हालिया पर्याप्त है
  • फ़ंक्शन का परिणाम एक ऑब्जेक्ट होता है और जिस वस्तु को आप चाहते हैं वह पहुंच योग्य है

एक ही काम करने के तीन तरीके हैं:

  1. जैसा चाचा 102 कहते हैं, सूचकांक मूल्य वापस करने के लिए एक फ़ंक्शन का उपयोग करें:

     function get($from, $id){ return $from[$id]; } 

    फिर, आप इसका उपयोग कर सकते हैं:

     get($foo->getBarArray(),0); 

    पहला तत्व प्राप्त करने के लिए और इतने पर।

  2. वर्तमान और array_slice का उपयोग करके एक आलसी तरीका:

     $first = current(array_slice($foo->getBarArray(),0,1)); $second = current(array_slice($foo->getBarArray(),1,1)); 
  3. एक ही फ़ंक्शन का उपयोग करने के लिए दोनों, सरणी और मूल्य:

     class FooClass { function getBarArray($id = NULL) { $array = array(); // Do something to get $array contents if(is_null($id)) return $array; else return $array[$id]; } } 

    तब आप पूरी सरणी और एकल सरणी आइटम प्राप्त कर सकते हैं।

     $array = $foo->getBarArray(); 

    या

     $first_item = $foo->getBarArray(0); 

पहले PHP 5.3 में आपको यह करना था:

 function returnArray() { return array(1, 2, 3); } $tmp = returnArray(); $ssecondElement = $tmp[1]; 

परिणाम: 2

PHP 5.4 के अनुसार यह एक सरणी के अनुसार dereference संभव है:

 function returnArray() { return array(1, 2, 3); } $secondElement = returnArray()[1]; 

परिणाम: 2

PHP 5.5 की तरह:

आप चालाक भी प्राप्त कर सकते हैं:

 echo [1, 2, 3][1]; 

परिणाम: 2

आप स्ट्रिंग्स के साथ भी ऐसा कर सकते हैं। इसे स्ट्रिंग डीरेंसिंग कहा जाता है:

 echo 'PHP'[1]; 

परिणाम: H

क्या यह काम करता है?

  return ($foo->getBarArray())[0]; 

अन्यथा, क्या आप getBarArray () फ़ंक्शन पोस्ट कर सकते हैं? मुझे नहीं पता है कि वह अब तक आपके द्वारा पोस्ट किए गए कार्यों से क्यों काम नहीं करेगा।

आप संदर्भ का उपयोग कर सकते हैं:

 $ref =& myFunc(); echo $ref['foo']; 

इस तरह, आप वास्तव में लौटे सरणी का डुप्लिकेट नहीं बना रहे हैं