একটি ফাংশন থেকে একাধিক রিটার্ন


198

এর মতো দুটি রিটার্ন সহ কোনও ফাংশন রাখা কি সম্ভব:

function test($testvar)
{
  // Do something

  return $var1;
  return $var2;
}

যদি তা হয় তবে আমি কীভাবে আলাদাভাবে প্রতিটি রিটার্ন পেতে পারি?


1
ঠিক কি আপনি সাধন করার চেষ্টা করছেন? অবশ্যই যদি আপনি আপনার আসল সমস্যাটি ব্যাখ্যা করেন তবে এখানে কেউ আপনাকে একটি মার্জিত সমাধানে আসতে সহায়তা করতে পারে।
মাইক ড্যানিয়েলস

3
প্রশ্ন দুটি / দুটি মানের মধ্যে দুটি বা দুটি মানের দুটি বা নতুন ধারণার অলস মূল্যায়ন একের পরে সম্ভবত দুটি মানের দুটির মধ্যে পার্থক্য রাখে না। প্রথমটি কোনও ধরনের শর্তাধীন প্রবাহের সাথে তুচ্ছ। দ্বিতীয়টি পাইথনে অনুমোদিত: q, r = divmod (x, y); পাশাপাশি লিস্প; পিএইচপি-র তালিকার প্রয়োজন ($ q, $ r) = twovals (); হ্যাক, যেখানে ফাংশন টুভাল () {রিটার্ন অ্যারে ($ এ, $ বি); }। অলস মূল্যায়ন বরং উন্নত এবং এখনও পিএইচপি তে ধরা দেয়নি। যেহেতু প্রশ্নটি সুনির্দিষ্ট নয়, তাই এই বিষয়টির জন্য সুনির্দিষ্ট রেফারেন্স হিসাবে এই প্রবেশটি ব্যবহার না করার পরামর্শ দিন।
ড্রাগনলর্ড

5
আপনার যদি উভয় মান প্রয়োজন হয় তবে এটিকে একটি অ্যারেতে ফিরিয়ে দিন।
ভরগাভ নানেকালভা

2
পিএইচপি .1.১-এ @ ড্রাগনলর্ড, আপনি সংক্ষিপ্ত তালিকার বাক্য গঠন
জানুস ট্রয়লসন

1
এখানে একটি সদৃশ প্রশ্ন রয়েছে, তবে আরও সংক্ষিপ্ত উত্তরগুলির সাথে এটি আপনাকে এই মুহুর্তে দ্রুততর করে তুলবে: একটি ফাংশন থেকে 2 মান ফেরত দেওয়া
গ্রাস ডাবল

উত্তর:


162

2 টি ভেরিয়েবল ফেরতের উপায় নেই। যদিও, আপনি একটি অ্যারে প্রচার করতে পারেন এবং এটি ফেরত দিতে পারেন; গতিশীল পরিবর্তনশীল ইত্যাদি ফিরিয়ে আনার জন্য শর্তসাপেক্ষ তৈরি করুন etc.

উদাহরণস্বরূপ, এই ফাংশনটি ফিরে আসবে $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
যদি কেবল পিএইচপি-এর পার্ল থাকেwantarray()
মার্ক বি বি

6
এই উত্তরটি উন্নত হবে যদি এটি প্রথম অংশ বাদ দেয় তবে কিছু শর্তের উপর নির্ভর করে কীভাবে এক বা আলাদা মান ফেরত দেওয়া যায় তা নিয়ে আলোচনা করা হয় । আমি নিশ্চিত যে এই আলোচনায় আসা 99.999 +% লোক একই সাথে কীভাবে উভয় মান ফিরিয়ে আনবেন তা জানতে চান । সর্বাধিক ভোট দেওয়া উত্তর দেখুন।
নির্মাতা স্টিভ 21

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সমাধান বরং একটি পিএইচপি-ভিত্তিক এক। একই কাঠামোগুলি সহ কয়েকটি ভাষা রয়েছে তবে আরও বেশি ভাষা রয়েছে। আরও একটি উপায় রয়েছে যা সাধারণত একাধিক মান "ফেরত" দিতে ব্যবহৃত হয় এবং এটি প্রায় প্রতিটি ভাষায় (এক উপায়ে বা অন্য কোনও ক্ষেত্রে) উপলভ্য। তবে, এই পদ্ধতিটি একেবারেই আলাদা দেখায় তাই কিছু অভ্যস্ত হওয়ার প্রয়োজন হতে পারে।

// 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);

এই কৌশলটি এছাড়াও কিছু ফাংশন পিএইচপি নিজে সংজ্ঞায়িত ব্যবহার করা হয় (যেমন $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;

উপরের পদ্ধতিগুলি একটি ফাংশন থেকে একাধিক মান প্রত্যাবর্তনের প্রধান উপায়গুলি যোগ করে। তবে এই পদ্ধতিগুলির মধ্যে বিভিন্নতা রয়েছে। সর্বাধিক আকর্ষণীয় ভিন্নতাগুলি হ'ল সেগুলি হ'ল যা আপনি আসলে একটি অ্যারে ফিরিয়ে দিচ্ছেন, কেবলমাত্র পিএইচপি-তে অ্যারে সহ আপনি অনেক কিছু করতে পারবেন বলেই।

প্রথমত, আমরা কেবল একটি অ্যারে ফিরিয়ে দিতে পারি এবং এটিকে অ্যারে ব্যতীত অন্য কোনও হিসাবে বিবেচনা করি না:

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'];

পিএইচপি-তে এমন 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.net/manual/en/function.list.php .. ধন্যবাদ জ্যাস্পার!
জাস্টিনপি

2
এত বিস্তৃত উত্তরটির জন্য +1, বিশেষত এত বিস্তৃত, সাধারণ প্রশ্নের question তা সত্ত্বেও, এই উত্তরটি আমাকে প্রচুর সহায়তা করেছে।
লি ব্লেক

2
@ মাইকি Histতিহাসিক কারণ এই উত্তরটি মূলত একটি পৃথক প্রশ্নে পোস্ট করা হয়েছিল, এটির সঠিক সদৃশ হওয়ার কারণে এটি মুছে ফেলা হয়েছিল (এটি সত্যই বয়স্ক হওয়া সত্ত্বেও)। যিনি এই প্রশ্নটি জিজ্ঞাসা করেছিলেন তার শেষ দেখার চেয়ে উত্তরটি এই প্রশ্নের পরে স্থানান্তরিত হয়েছিল।
জ্যাস্পার

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?
পিটার মর্টেনসেন

@ পিটারমোরটেনসেন:$result_2
টিম কুপার

46

পিএইচপি 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];

পিএইচপি 7.1 এর জন্য নতুন বৈশিষ্ট্য পৃষ্ঠাটি একবার দেখুন:

নতুন বৈশিষ্ট


5
আমি আশা করি স্ট্যাকওভারফ্লোতে 'বৈশিষ্ট্যযুক্ত উত্তর' এর মতো একটি বৈশিষ্ট্য থাকবে এমনকি যখন প্রশ্নটি তৈরির সময় এটি গৃহীত হয় না কারণ এখানে এই উত্তরটি বেশ কার্যকর এবং আপডেটেড, তবে অবশ্যই এটি অফ-বিষয়, অবশ্যই।
জোনাটাস সিডি

3
@ জোনাটাসসিডি - আপনি কেন এই উত্তরটি "অফ-টপিক" বলেছেন তা নিশ্চিত নন। পিএইচপি 7.1 এটি হল সবচেয়ে সুবিধাজনক উপায় তৈরি এবং একটি ফাংশন থেকে একাধিক রিটার্ন মান হ্যান্ডেল করতে। সুতরাং নতুন পিএইচপি সংস্করণগুলির জন্য এটি মূল গৃহীত উত্তরের একটি উচ্চতর উত্তর।
টুলমেকারস্টেভ

@ টুলমেকারস্টিভ আমি মনে করি আপনি আমাকে ভুল বুঝেছেন। ভবিষ্যতের বাস্তবায়নের ভিত্তিতে গ্রহণযোগ্য প্রশ্নটি কী তা পরিবর্তন করতে সক্ষম হওয়ায় প্রশ্নের "অফ-টপিক" ছিল আমার পরামর্শ। এটি আপনার উত্তরের বিরুদ্ধে কিছুই ছিল না;)
জোনাটাস সিডি

@ জোনাটাসসিডি - আহ এটি ব্যাখ্যা করে। (আমার উত্তর নয়, আমি কেবল বিস্মিত হয়ে পড়েছিলাম।) কমপক্ষে একটি ট্যাগ যা বলে যে "এটি গৃহীত উত্তরের চেয়ে বেশি আধুনিক" "হতে পারে তিন জনকে সেই ট্যাগটির সাথে একমত হতে হবে, এবং তারপরে এটি বৈশিষ্ট্যযুক্ত হয়ে উঠবে। :)
টুলমেকারস্টেভ

26

পিএইচপি 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'));

এটি বলেছিল, আপনি যে কোনওটি সমাধান করার চেষ্টা করছেন তার জন্য কিছুটা সময় নেওয়া এবং চিন্তা করা মূল্যবান। জটিল ফলাফলের মান (অ্যারে বা কোনও বস্তুর মতো) ফেরত দেওয়ার সময় পুরোপুরি বৈধ, আপনি যদি ভাবছেন যে "আমি দুটি মান ফিরিয়ে দিতে চাই", আপনি সম্ভবত নকশা করছেন be আপনার প্রশ্নে আরও বিশদ ছাড়া এটি বলা শক্ত, তবে কখনও থামতে এবং দু'বার ভাবতে কষ্ট দেয় না।


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

পিএইচপি 7.1 এর জন্য <= আপনি নতুন সিনট্যাক্স ব্যবহার করতে পারেন ( তালিকার ফাংশনের পরিবর্তে ):

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

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

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

আপনি যদি 2-3 ভেরিয়েবলগুলি ফিরিয়ে দিতে চান তবে এটি আমার পক্ষে ঠিক আছে, অন্যথায় আপনার পছন্দসই বৈশিষ্ট্যযুক্ত কোনও জিনিস ব্যবহার করা উচিত।


4

আমি একাধিক রিটার্ন মান পিএইচপি ফাংশনের জন্য এর মতো বাস্তবায়ন করেছি। আপনার কোড সহ সুন্দর হতে। ধন্যবাদ.

 <?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

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

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

এই কোডটি আসলে পিএইচপি-র ওয়েবসাইটে নিম্নলিখিত পৃষ্ঠা থেকে অনুলিপি করা হয়েছে: http://php.net/manual/en/funitions.returning-values.php আমি নিজেও বহু বার একই ধরণের কোড ব্যবহার করেছি, তাই নিশ্চিত করতে পারি যে এটি ভাল এবং এটি কাজ করে।


এই উত্তরটিতে প্রশ্নের উদাহরণ হিসাবে উল্লেখ করা উত্তর, তাই এটি কঠোরভাবে ভুল নয়। তবে প্রশ্নটি অস্পষ্ট। অভিপ্রায় হয় সম্ভবত এক ফাংশন কল থেকে দুটি মানের দেখাবে।
পিটার মর্টেনসেন

3

পিএইচপি-র কার্যকারিতা কেবলমাত্র একটি পরিবর্তনশীল ফিরিয়ে দিতে পারে। আপনি বিশ্বব্যাপী স্কোপ সহ ভেরিয়েবলগুলি ব্যবহার করতে পারেন, আপনি অ্যারেটি ফিরে আসতে পারেন, বা আপনি ফাংশনটি উল্লেখ করে এবং পরিবর্তিত মানের চেয়ে ভেরিয়েবল পাস করতে পারেন, তবে সেগুলি আপনার কোডের পঠনযোগ্যতা হ্রাস করবে। আমি আপনাকে ক্লাসে সন্ধান করার পরামর্শ দিচ্ছি।


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

যে ভাষাগুলি একাধিক রিটার্ন দেয় তা সাধারণত একাধিক মানকে ডেটা কাঠামোতে রূপান্তর করে।

উদাহরণস্বরূপ, পাইথনে আপনি একাধিক মান ফিরিয়ে দিতে পারেন। যাইহোক, তারা আসলে কেবল একটি টুপল হিসাবে ফিরে আসছেন।

সুতরাং আপনি কেবল একটি সাধারণ অ্যারে তৈরি করে এবং এটি ফিরিয়ে পিএইচপি-তে একাধিক মান ফিরিয়ে আনতে পারেন।


0

আপনি দুটি বা ততোধিক ভেরিয়েবলের মান রেফারেন্স দ্বারা সেট করে তাদের পেতে পারেন:

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


t($a, $b);

echo $a . '  ' . $b;

আউটপুট:

1 2

পুনরায় "দুই বা ততোধিক ভেরিয়েবলের মান পেতে" : আপনি কি বলতে চান না "দুই বা ততোধিক ভেরিয়েবল ফেরত মান হল" ?
পিটার মর্টেনসেন

0

পিএইচপি এখনও "আউট প্যারামিটার" ব্যবহার করে? যদি তা হয় তবে আপনি নিজের ফাংশনে যাওয়ার পরে এক বা একাধিক পরামিতিগুলি সংশোধন করতে সিনট্যাক্সটি ব্যবহার করতে পারেন। তারপরে আপনি আপনার ফাংশন ফেরার পরে পরিবর্তিত পরিবর্তনশীলটি ব্যবহার করতে পারবেন।


-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 ঘোষণা করছেন। 'ও' পাশাপাশি পুরোপুরি রিটার্নের বিবৃতি সরান এবং আপনি দেখতে পাবেন যে আপনার ফলাফল একই থাকবে the
ম্যাট স্টাইলগুলি

এটি অত্যন্ত বিভ্রান্তিমূলক, যেহেতু আপনি $ b_id এবং $ f_id বিশ্বব্যাপী ঘোষণা করেছেন, সুতরাং যে কোনও প্রসঙ্গ থেকে উপলভ্য।
পলুস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.