एक फ़ंक्शन से कई रिटर्न


198

क्या इस तरह से दो रिटर्न के साथ फ़ंक्शन करना संभव है:

function test($testvar)
{
  // Do something

  return $var1;
  return $var2;
}

यदि हां, तो मैं प्रत्येक रिटर्न को अलग से कैसे प्राप्त कर पाऊंगा?


1
वास्तव में आप क्या हासिल करने की कोशिश कर रहे हैं? निश्चित रूप से यदि आपने अपनी वास्तविक समस्या को समझाया, तो यहाँ कोई आपको एक सुरुचिपूर्ण समाधान पर पहुंचने में मदद कर सकता है।
माइक डेनियल

3
प्रश्न दोनों में से किसी एक / या दोनों मानों में अंतर नहीं करता है, दोनों में दो दो मान हैं, या नई अवधारणा आलसी मूल्यांकन एक तो संभवतः दो में से दो मान हैं। पहला किसी भी प्रकार के सशर्त प्रवाह के साथ तुच्छ है। दूसरे को अजगर में अनुमति दी जाती है: q, r = divmod (x, y); साथ ही लिस्प; PHP को सूची ($ q, $ r) = twovals () की आवश्यकता होती है; हैक, जहां फ़ंक्शन ट्वोवल्स () {रिटर्न ऐरे ($ a, $ b); }। आलसी मूल्यांकन बल्कि उन्नत है और अभी तक पीएचपी में पकड़ा नहीं गया है। चूंकि प्रश्न सटीक नहीं है, इसलिए इस विषय के लिए निश्चित संदर्भ के रूप में इस प्रविष्टि का उपयोग न करने की सलाह दें।
ड्रैगनट्ल ऑग

5
यदि आपको दोनों मानों की आवश्यकता है, तो उन्हें एक सरणी में लौटा दें।
भार्गव नेनकलेवा


1
एक डुप्लिकेट प्रश्न है, लेकिन अधिक संक्षिप्त जवाब के साथ इस प्रकार यह आपको तेजी से इस बिंदु पर ले जाएगा: किसी फ़ंक्शन से 2 मान लौटना
ग्रास डबल

जवाबों:


162

2 चर वापस करने का कोई तरीका नहीं है। यद्यपि, आप एक सरणी का प्रचार कर सकते हैं और इसे वापस कर सकते हैं; एक गतिशील चर, आदि को वापस करने के लिए एक सशर्त बनाएं।

उदाहरण के लिए, यह फ़ंक्शन वापस आएगा $var2

function wtf($blahblah = true) {
    $var1 = "ONe";
    $var2 = "tWo";

    if($blahblah === true) {
      return $var2;
    }
    return $var1;
}

आवेदन में:

echo wtf();
//would echo: tWo
echo wtf("not true, this is false");
//would echo: ONe

यदि आप उन दोनों को चाहते थे, तो आप फ़ंक्शन को थोड़ा संशोधित कर सकते हैं

function wtf($blahblah = true) {
    $var1 = "ONe";
    $var2 = "tWo";

    if($blahblah === true) {
      return $var2;
    }

    if($blahblah == "both") {
      return array($var1, $var2);
    }

    return $var1;
}

echo wtf("both")[0]
//would echo: ONe
echo wtf("both")[1]
//would echo: tWo

list($first, $second) = wtf("both")
// value of $first would be $var1, value of $second would be $var2

15
यदि केवल PHP के पास पर्लwantarray()
मार्क बी

6
IMHO इस उत्तर को बेहतर बनाया जाएगा यदि यह पहले भाग को छोड़ देता है, जो चर्चा करता है कि किसी स्थिति के आधार पर एक या एक अलग मान कैसे लौटाया जाए । मुझे यकीन है कि इस चर्चा में आने वाले 99.999 +% लोग जानना चाहते हैं कि एक ही समय में दोनों मूल्यों को कैसे वापस किया जाए । सबसे ज्यादा वोट दिए गए जवाब देखें।
टूलमेकरसेव

401

तकनीकी रूप से, आप एक से अधिक मूल्य वापस नहीं कर सकते। हालाँकि, उस सीमा के आसपास काम करने के कई तरीके हैं। वह तरीका जो कई मानों को लौटाने की तरह काम करता है, वह listकीवर्ड के साथ है :

function getXYZ()
{
    return array(4,5,6);
}

list($x,$y,$z) = getXYZ();

// Afterwards: $x == 4 && $y == 5 && $z == 6
// (This will hold for all samples unless otherwise noted)

तकनीकी रूप से, आप एक सरणी लौटा रहे हैं और listवास्तविक सरणी को संग्रहीत करने के बजाय उस सरणी के तत्वों को विभिन्न मूल्यों में संग्रहीत करने के लिए उपयोग कर रहे हैं। इस तकनीक का उपयोग करने से यह कई मूल्यों को वापस करने की तरह महसूस करेगा ।

listसमाधान एक नहीं बल्कि php-विशिष्ट एक है। इसी तरह की संरचनाओं के साथ कुछ भाषाएँ हैं, लेकिन अधिक भाषाएँ जो नहीं हैं। एक और तरीका है जो आमतौर पर कई मूल्यों को "वापस" करने के लिए उपयोग किया जाता है और यह बस हर भाषा (एक तरह से या किसी अन्य) के बारे में उपलब्ध है। हालाँकि, यह विधि काफी भिन्न दिखाई देगी, इसलिए कुछ को उपयोग करने की आवश्यकता हो सकती है।

// note that I named the arguments $a, $b and $c to show that
// they don't need to be named $x, $y and $z
function getXYZ(&$a, &$b, &$c)
{
    $a = 4;
    $b = 5;
    $c = 6; 
}

getXYZ($x, $y, $z);

इस तकनीक को भी कुछ कार्यों php से ही परिभाषित में प्रयोग किया जाता है (उदाहरण के लिए $countमें str_replace , $matchesमें preg_match )। यह कई मूल्यों को वापस करने से काफी अलग लग सकता है, लेकिन इसके बारे में कम से कम जानने योग्य है।

एक तीसरी विधि एक वस्तु का उपयोग करने के लिए आपके द्वारा आवश्यक विभिन्न मूल्यों को रखने के लिए है। यह अधिक टाइपिंग है, इसलिए इसे ऊपर के दो तरीकों के रूप में अक्सर उपयोग नहीं किया जाता है। इसका उपयोग करने के लिए समझ में आ सकता है, हालांकि, जब कई स्थानों में चर का एक ही सेट का उपयोग किया जाता है (या निश्चित रूप से, ऐसी भाषा में काम करना जो उपरोक्त विधियों का समर्थन नहीं करता है या आपको अतिरिक्त टाइपिंग के बिना ऐसा करने की अनुमति देता है)।

class MyXYZ
{
    public $x;
    public $y;
    public $z;
}

function getXYZ()
{
    $out = new MyXYZ();

    $out->x = 4;
    $out->y = 5;
    $out->z = 6;

    return $out;
}

$xyz = getXYZ();

$x = $xyz->x;
$y = $xyz->y;
$z = $xyz->z;

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

सबसे पहले, हम केवल एक सरणी वापस कर सकते हैं और इसे कुछ भी नहीं बल्कि एक सरणी के रूप में मान सकते हैं:

function getXYZ()
{
    return array(1,2,3);
}

$array = getXYZ();

$x = $array[1];
$y = $array[2];
$z = $array[3];

ऊपर दिए गए कोड के बारे में सबसे दिलचस्प हिस्सा यह है कि फ़ंक्शन के अंदर का कोड वही है जो मैंने पहले उदाहरण में दिया था; केवल फ़ंक्शन को कॉल करने वाला कोड बदल गया। इसका मतलब यह है कि यह फ़ंक्शन को कॉल करने वाले पर निर्भर करता है कि परिणाम कैसे लौटाता है।

वैकल्पिक रूप से, कोई एक सहयोगी सरणी का उपयोग कर सकता है:

function getXYZ()
{
    return array('x' => 4,
                 'y' => 5,
                 'z' => 6);
}

$array = getXYZ();

$x = $array['x'];
$y = $array['y'];
$z = $array['z'];

Php में वह compactफ़ंक्शन होता है जो आपको उपरोक्त के समान करने की अनुमति देता है लेकिन कम कोड लिखते समय। (ठीक है, नमूने में कम कोड नहीं होगा, लेकिन एक वास्तविक विश्व अनुप्रयोग शायद होगा।) हालांकि, मुझे लगता है कि टाइपिंग बचत की मात्रा न्यूनतम है और यह कोड को पढ़ने के लिए कठिन बनाता है, इसलिए मैं इसे स्वयं नहीं करूंगा। फिर भी, यहाँ एक नमूना है:

function getXYZ()
{
    $x = 4;
    $y = 5;
    $z = 6;

    return compact('x', 'y', 'z');
}

$array = getXYZ();

$x = $array['x'];
$y = $array['y'];
$z = $array['z'];

यह ध्यान दिया जाना चाहिए कि जबकि compactएक समकक्ष में हैextract जिसका उपयोग यहां कॉलिंग कोड में किया जा सकता है, लेकिन चूंकि इसका उपयोग करने के लिए एक बुरा विचार है (विशेष रूप से सरल रूप में कुछ के लिए) मैं इसके लिए एक नमूना भी नहीं दूंगा। समस्या यह है कि यह "जादू" करेगा और आपके लिए चर बनाएगा, जबकि आप यह नहीं देख सकते हैं कि कोड के अन्य भागों में जाने के बिना कौन से चर बनाए जाते हैं।

अंत में, मैं उल्लेख करना चाहूंगा कि वास्तव में साहचर्य सरणी के साथ अच्छा listनहीं खेलता है। निम्नलिखित वही करेगा जो आप उम्मीद करते हैं:

function getXYZ()
{
    return array('x' => 4,
                 'y' => 5,
                 'z' => 6);
}

$array = getXYZ();

list($x, $y, $z) = getXYZ();

हालाँकि, निम्नलिखित कुछ अलग करेगा:

function getXYZ()
{
    return array('x' => 4,
                 'z' => 6,
                 'y' => 5);
}

$array = getXYZ();

list($x, $y, $z) = getXYZ();

// Pay attention: $y == 6 && $z == 5

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


2
इसके अलावा: वापसी कॉम्पैक्ट ('var1', 'var2', 'var3');
ब्यूडसन

1
यह एक और विकल्प है, लेकिन यह मेरे लिए कई मूल्यों को वापस करने के रूप में महसूस नहीं करता है, जैसे कि एक सरणी को वापस करना। हालांकि यह सिर्फ मुझे हो सकता है। व्यक्तिगत रूप से, मुझे return array('x' => $x, 'y' => $y, 'z' => $z)क्लीनर मिल जाएगा , लेकिन उस बिंदु पर जहां मैं इसे खुद लिखूंगा, उस बिंदु पर नहीं जहां मैं दूसरों से उस प्रारूप का उपयोग करने के लिए कहूंगा।
जैस्पर

2
लिस्ट () का उपयोग करना मेरे पास मौजूद सिमुलर समस्या का एक शानदार जवाब है। यह एक शानदार तरीका है जो एक फ़ंक्शन में कई वेरिएबल्स को वापस सत्यापित और वापस करता है। php डॉक्स पर एक त्वरित नज़र इस फ़ंक्शन पर अधिक प्रकाश डालेगी और शायद इसे और अधिक स्पष्ट कर देगी। php.net/manual/en/function.list.php .. धन्यवाद जैस्पर!

2
इस तरह के एक व्यापक जवाब के लिए, विशेष रूप से इस तरह के एक व्यापक, सामान्य प्रश्न के लिए। उसके बावजूद, इस जवाब ने मुझे बहुत मदद की है।
ली ब्लेक

2
@ मायिक ऐतिहासिक कारण। यह उत्तर मूल रूप से एक अलग प्रश्न पर पोस्ट किया गया था, जिसे इस एक के सटीक डुप्लिकेट होने के लिए हटा दिया गया था (इस तथ्य के बावजूद कि यह वास्तव में पुराना था)। इस प्रश्न का उत्तर बाद में उस व्यक्ति की अंतिम यात्रा की तुलना में दिया गया था जिसने यह प्रश्न पूछा था।
जैस्पर

73

आपके उदाहरण में, दूसरा रिटर्न कभी नहीं होगा - पहली वापसी है आखिरी चीज जो पीएचपी चलेगी। यदि आपको कई मान वापस करने हैं, तो एक सरणी लौटाएँ:

function test($testvar) {

    return array($var1, $var2);
}

$result = test($testvar);
echo $result[0]; // $var1
echo $result[1]; // $var2

18
आप यह भी कर सकते हैं:list($result_1, result_2) = test($testvar);
टिम कूपर

@ समय कूपर: result_2या $result_2?
पीटर मोर्टेंसन

@PeterMortensen:$result_2
टिम कूपर

46

PHP 7.1 के बाद से हमारे पास सूचियों के लिए उचित विनाशकारी है। जिससे आप इस तरह की चीजें कर सकते हैं:

$test = [1, 2, 3, 4];
[$a, $b, $c, $d] = $test;
echo($a);
> 1
echo($d);
> 4

एक समारोह में यह इस तरह दिखेगा:

function multiple_return() {
    return ['this', 'is', 'a', 'test'];
}

[$first, $second, $third, $fourth] = multiple_return();
echo($first);
> this
echo($fourth);
> test

विनाशकारी एक बहुत शक्तिशाली उपकरण है। यह कुंजी => मूल्य जोड़े को नष्ट करने में सक्षम है:

["a" => $a, "b" => $b, "c" => $c] = ["a" => 1, "b" => 2, "c" => 3];

PHP 7.1 के लिए नए फ़ीचर पेज पर एक नज़र डालें:

नए विशेषताएँ


5
काश, StackOverflow में 'फ़ीचर किए गए उत्तर' जैसी कोई विशेषता होती, तब भी जब प्रश्न के निर्माण के समय तक स्वीकार नहीं किया जाता, क्योंकि यहाँ यह उत्तर काफी उपयोगी और अद्यतन है, लेकिन यह ऑफ-टॉपिक है, ज़ाहिर है।
जोनाटास सीडी

3
@JonatasCD - निश्चित नहीं है कि आप क्यों कहते हैं कि यह उत्तर "ऑफ-टॉपिक" है। Php 7.1 में यह है सबसे सुविधाजनक तरीका बना सकते हैं और एक समारोह से कई वापसी मानों का प्रबंधन कैसे। तो नए php संस्करणों के लिए, इसका मूल स्वीकार किए गए उत्तर के लिए एक बेहतर जवाब है।
टूलमेकरस्टेव

@ToolmakerSteve मुझे लगता है कि आपने मुझे गलत समझा। प्रश्न का "ऑफ-टॉपिक" भविष्य में कार्यान्वयन के आधार पर स्वीकार किए गए प्रश्न को बदलने में सक्षम होने का मेरा सुझाव था। यह आपके जवाब के खिलाफ कुछ भी नहीं था;)
जोनाटास सीडी

@JonatasCD - आहह जो इसे समझाते हैं। (मेरा जवाब नहीं है, मैं तो हैरान था।) कम से कम एक टैग जो कहता है "यह स्वीकृत उत्तर की तुलना में अधिक अद्यतित है" हो सकता है कि तीन लोगों को उस टैग से सहमत होना पड़े, और फिर यह चित्रित हो जाता है। :)
टूलमेकरसैट

26

PHP 5.5 में एक नई अवधारणा भी है: generatorsजहाँ आप एक फ़ंक्शन से कई मान प्राप्त कर सकते हैं:

function hasMultipleValues() {
    yield "value1";
    yield "value2";
}

$values = hasMultipleValues();
foreach ($values as $val) {
    // $val will first be "value1" then "value2"
}

16

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

function byRef($x, &$a, &$b)
{
    $a = 10 * $x;
    $b = 100 * $x;
}

$a = 0;
$b = 0;

byRef(10, $a, $b);

echo $a . "\n";
echo $b;

यह आउटपुट होगा

100
1000

9

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

function test()
{
    return [ 'model' => 'someValue' , 'data' => 'someothervalue'];
}

अब आप इस का उपयोग कर सकते हैं

$result = test();
extract($result);

extractसरणी में प्रत्येक सदस्य के लिए एक चर बनाता है, उस सदस्य के नाम पर। इसलिए आप अब पहुँच सकते हैं $modelऔर$data


1
नोट: सावधान रहें कि कुंजी (यहां modelऔर data) पहले से ही चर के रूप में मौजूद नहीं हैं। यदि वे करते हैं, तो संघर्ष से बचने prefixके extractलिए पैरामीटर का उपयोग करें ।
टूलमेकरस्टेव

7

आप एक फ़ंक्शन से कई सरणियाँ और स्केल वापस कर सकते हैं

function x()
{
    $a=array("a","b","c");
    $b=array("e","f");
    return array('x',$a,$b);
}

list ($m,$n,$o)=x();

echo $m."\n";
print_r($n);
print_r($o);

7

इसके दो रिटर्न स्टेटमेंट संभव नहीं हैं। हालाँकि, यह त्रुटि नहीं फेंकता है, लेकिन जब फ़ंक्शन को कॉल किया जाता है तो आपको केवल पहला रिटर्न स्टेटमेंट मान प्राप्त होगा। बदले में कई मान प्राप्त करने के लिए हम एरे के रिटर्न का उपयोग कर सकते हैं। उदाहरण के लिए:

function test($testvar)
{
  // do something
  //just assigning a string for example, we can assign any operation result
  $var1 = "result1";
  $var2 = "result2";
  return array('value1' => $var1, 'value2' => $var2);
}

5

कार्य, परिभाषा के अनुसार, केवल एक मान लौटाते हैं।

हालाँकि, जैसा कि आपने माना, वह मान एक सरणी हो सकता है।

तो आप निश्चित रूप से कुछ ऐसा कर सकते हैं:

<?PHP
function myfunc($a,$b){
   return array('foo'=>$a,'bar'=>$b);
}
print_r(myfunc('baz','bork'));

उस ने कहा, यह एक पल लेने के लायक है और आप जो भी हल करने की कोशिश कर रहे हैं उसके बारे में सोच रहे हैं। यदि आप एक जटिल परिणाम मान (जैसे कोई सरणी, या ऑब्जेक्ट) लौटा रहे हैं, तो यह पूरी तरह से मान्य है, यदि आप सोच रहे हैं कि "मैं दो मान वापस करना चाहता हूं", तो आप खराब तरीके से डिजाइन कर सकते हैं। आपके प्रश्न में अधिक विस्तार के बिना, यह कहना मुश्किल है, लेकिन इसे रोकने और दो बार सोचने के लिए कभी दर्द नहीं होता है।


5

बेस्ट प्रैक्टिस है अपने लौटे हुए वेरिएबल्स को ऐरे में डालना और फिर list()ऐरे वैल्यूज़ को वेरिएबल्स में असाइन करना।

<?php

function add_subt($val1, $val2) {
    $add = $val1 + $val2;
    $subt = $val1 - $val2;

    return array($add, $subt);
}

list($add_result, $subt_result) = add_subt(20, 7);
echo "Add: " . $add_result . '<br />';
echo "Subtract: " . $subt_result . '<br />';

?>

5

हां, आप किसी ऑब्जेक्ट का उपयोग कर सकते हैं :-)

लेकिन सबसे आसान तरीका एक सरणी वापस करना है:

return array('value1', 'value2', 'value3', '...');

5

PHP 7.1 <= के लिए आप नए सिंटैक्स का उपयोग कर सकते हैं ( सूची फ़ंक्शन के बजाय ):

/**
* @return  array  [foo, bar]
*/
function getFooAndBar(): array {
    return ['foo', 'bar'];
}

[$foo, $bar] = getFooAndBar();

print 'Hello '. $foo . ' and ' . $bar;

यदि आप 2-3 चर वापस करना चाहते हैं तो यह मेरे लिए ठीक है, अन्यथा आपको वांछित गुणों के साथ एक वस्तु का उपयोग करना चाहिए।


4

मैंने कई रिटर्न वैल्यू PHP फ़ंक्शन के लिए इसे लागू किया है। अपने कोड के साथ अच्छा हो। धन्यवाद।

 <?php
    function multi_retun($aa)
    {
        return array(1,3,$aa);
    }
    list($one,$two,$three)=multi_retun(55);
    echo $one;
    echo $two;
    echo $three;
    ?>

4

हरे रंग की टिक के ऊपर दिया गया उत्तर वास्तव में गलत है। यदि आप एक सरणी लौटाते हैं, तो आप PHP में कई मान लौटा सकते हैं। एक उदाहरण के लिए निम्न कोड देखें:

<?php

function small_numbers()
{
    return array (0, 1, 2);
}

list ($zero, $one, $two) = small_numbers();

यह कोड वास्तव में PHP की वेबसाइट पर निम्नलिखित पेज से कॉपी किया गया है: http://php.net/manual/en/functions.returning-values.php मैंने खुद भी कई बार एक ही तरह के कोड का उपयोग किया है, इसलिए पुष्टि कर सकते हैं कि यह अच्छा है और यह काम करता है।


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

3

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


3

सोचा था ऊपर से कुछ प्रतिक्रियाओं पर विस्तार करूंगा…।

class nameCheck{

public $name;

public function __construct(){
    $this->name = $name;
}

function firstName(){
            // If a name has been entered..
    if(!empty($this->name)){
        $name = $this->name;
        $errflag = false;
                    // Return a array with both the name and errflag
        return array($name, $errflag);
            // If its empty..
    }else if(empty($this->name)){
        $errmsg = 'Please enter a name.';
        $errflag = true;
                    // Return both the Error message and Flag
        return array($errmsg, $errflag);
    }
}

}


if($_POST['submit']){

$a = new nameCheck;
$a->name = $_POST['name'];
//  Assign a list of variables from the firstName function
list($name, $err) = $a->firstName();

// Display the values..
echo 'Name: ' . $name;
echo 'Errflag: ' . $err;
}

?>
<form method="post" action="<?php $_SERVER['PHP_SELF']; ?>" >
<input name="name"  />
<input type="submit" name="submit" value="submit" />
</form>

यह आपको एक इनपुट फ़ील्ड और सबमिट बटन देगा, यदि नाम इनपुट फ़ील्ड खाली है तो यह त्रुटि ध्वज और एक संदेश लौटाएगा। यदि नाम फ़ील्ड का मान है, तो यह मान / नाम और गलत के झंडे के लिए 0 = कोई त्रुटि नहीं लौटाएगा। उम्मीद है की यह मदद करेगा!


3

कुछ वस्तु के रूप में कई मान लौटाना पसंद कर सकते हैं:

function test() {
    $object = new stdClass();

    $object->x = 'value 1';
    $object->y = 'value 2';

    return $object;
}

और इसे इस तरह से कॉल करें:

echo test()->x;

या:

$test = test();
echo $test->y;

3

हां और ना। आप एक से अधिक चर / वस्तु नहीं लौटा सकते, लेकिन जैसा कि आप सुझाव देते हैं, आप उन्हें एक सरणी में रख सकते हैं और वापस आ सकते हैं।

सरणियों के घोंसले के शिकार की कोई सीमा नहीं है, इसलिए आप उन्हें वापस लौटने के लिए उस तरह से पैकेज कर सकते हैं।


2

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


1

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


सख्ती से, हाँ। लेकिन सवाल अस्पष्ट है। शायद एक फ़ंक्शन कॉल से दो मान वापस करने का इरादा था।
पीटर मोर्टेंसन

1

किसी सरणी में सभी चर जोड़ें और फिर अंत में वापस लौटें array

function test($testvar)
{
  // do something
  return array("var1" => $var1, "var2" => @var2);
}

और तब

$myTest = test($myTestVar);
//$myTest["var1"] and $myTest["var2"] will be usable

1

मुझे लगता है कि एलीगो ने जवाब स्पष्ट रूप से समझाया है। लेकिन यदि आप दोनों मानों को वापस करना चाहते हैं, तो उन्हें एक सरणी में रखें और वापस लौटा दें।

function test($testvar)
{
  // do something

  return array('var1'=>$var1,'var2'=>$var2);
//defining a key would be better some times   
}

// रिटर्न वैल्यू तक पहुंचने के लिए

$returned_values = test($testvar);

echo $returned_values['var1'];
echo $returned_values['var2'];

जब आपने यह लिखा था तो क्या आप शांत थे? मैं एक नज़र में 2 गलतियाँ कर सकता हूँ। 1) आप $thisकीवर्ड का उपयोग करते हैं फिर भी कोई वर्ग या वस्तु का उल्लेख नहीं किया गया है। 2) यदि आप अपने चर में मान लौटाते हैं $returned_values, तो आपको उस चर से प्रतिध्वनि करनी चाहिए:echo $returned_values['var1'];
dading84

मुद्दा तय किया।
गिहान डी सिल्वा

0
<?php
function foo(){
  $you = 5;
  $me = 10;
  return $you;
  return $me;
}

echo foo();
//output is just 5 alone so we cant get second one it only retuns first one so better go with array


function goo(){
  $you = 5;
  $me = 10;
  return $you_and_me =  array($you,$me);
}

var_dump(goo()); // var_dump result is array(2) { [0]=> int(5) [1]=> int(10) } i think thats fine enough

?>

0

ऐसी भाषाएं जो कई रिटर्न देती हैं, आमतौर पर कई मानों को डेटा संरचना में बदल देती हैं।

उदाहरण के लिए, पायथन में आप कई मान लौटा सकते हैं। हालांकि, वे वास्तव में सिर्फ एक टपल के रूप में वापस आ रहे हैं।

तो आप PHP में एक साधारण सरणी बनाकर और वापस लौटकर कई मान वापस कर सकते हैं।


0

आप संदर्भ द्वारा उन्हें सेट करके दो या अधिक चर के मान प्राप्त कर सकते हैं:

function t(&$a, &$b) {
    $a = 1;
    $b = 2;
}


t($a, $b);

echo $a . '  ' . $b;

आउटपुट:

1 2

पुन "दो या अधिक चरों के मान मिलता है" : क्या आपका मतलब है "दो या अधिक चरों की वापसी मान" ?
पीटर मोर्टेंसन

0

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


-1

यह इसे करने का सबसे आसान तरीका है:

public function selectAllUsersByRole($userRole, $selector) {

    $this->userRole = $userLevel;
    $this->selector = $selector;

    $sql = "SELECT * FROM users WHERE role <= ? AND del_stat = 0";
    $stm = $this->connect()->prepare($sql); // Connect function in Dbh connect to database file
    $stm->execute([$this->userRole]); // This is PHP 7. Use array($this->userRole) for PHP 5

    $usersIdArray = array();
    $usersFNameArray = array();
    $usersLNameArray = array();

    if($stm->rowCount()) {
        while($row = $stm->fetch()) {

            array_push($usersIdArray,    $row['id']);
            array_push($usersFNameArray, $row['f_name']);
            array_push($usersLNameArray, $row['l_name']);

            // You can return only $row['id'] or f_name or ...
            // I used the array because it's most used.
        }
    }
    if($this->selector == 1) {
        return $usersIdArray;
    }elseif($this->selector == 2) {
        return $usersFNameArray;
    }elseif($this->selector == 3) {
        return $usersLNameArray;
    }

}

हम इस फ़ंक्शन को कैसे कह सकते हैं?

$idData = $selectAllUsers->selectAllUsersByLevel($userRole, 0);
print_r($idData);
$idFName = $selectAllUsers->selectAllUsersByLevel($userRole, 1);
print_r($idFname);

बस। बहुत आसान।


-1
$var1 = 0;
$var2 = 0;

function test($testvar, &$var1 , &$var2)
{
  $var1 = 1;
  $var2 = 2;
  return;
}
test("", $var1, $var2);

// var1 = 1, var2 = 2 

यह एक अच्छा तरीका नहीं है, लेकिन मुझे लगता है कि हम एक ही समय में एक फ़ंक्शन में दो चर सेट कर सकते हैं।


-4

मुझे इसी तरह की समस्या थी - इसलिए मैंने चारों ओर से कोशिश की और थोड़ा गुगला (इस धागे को ढूंढते हुए)। 5 मिनट के प्रयास और त्रुटि के बाद मुझे पता चला कि आप वापसी के एक लाइन में दो (शायद अधिक - अभी तक परीक्षण नहीं किए गए) लौटने के लिए "और" का उपयोग कर सकते हैं।

मेरा कोड:

  function get_id(){
    global $b_id, $f_id;
    // stuff happens
    return $b_id AND $f_id;
  }
  //later in the code:
  get_id();
  var_dump($b_id);
  var_dump($f_id); // tested output by var_dump

यह काम करता हैं। मुझे वे दोनों मूल्य मिले जिनकी मुझे अपेक्षा थी / मिलनी चाहिए। मुझे आशा है कि मैं इस धागे को पढ़ने में किसी की मदद कर सकता हूं :)


3
यह सही नहीं है। 'और' केवल एक बूलियन ऑपरेटर है, इस प्रकार आपका फ़ंक्शन वास्तव में एकल बूलियन मान लौटा रहा है। काम करने का एकमात्र कारण यह है क्योंकि आप $ b_id और $ f_id को वैश्विक चर के रूप में घोषित कर रहे हैं। 'और' और साथ ही वापसी विवरण को पूरी तरह से हटा दें और आप देखेंगे कि आपके परिणाम समान हैं।
मैट स्टाइल्स

यह बहुत ही भ्रामक है, क्योंकि आपने $ b_id और $ f_id को वैश्विक घोषित किया है, इसलिए यह किसी भी संदर्भ से उपलब्ध है।
पौलिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.