ผลตอบแทนหลายรายการจากฟังก์ชั่น


198

เป็นไปได้ไหมที่จะมีฟังก์ชั่นที่มีการคืนค่าสองค่าดังนี้:

function test($testvar)
{
  // Do something

  return $var1;
  return $var2;
}

ถ้าเป็นเช่นนั้นฉันจะได้รับผลตอบแทนแยกกันอย่างไร


1
คุณพยายามทำอะไรให้สำเร็จ แน่นอนถ้าคุณอธิบายปัญหาที่แท้จริงของคุณใครบางคนที่นี่สามารถช่วยให้คุณมาถึงทางออกที่สง่างาม
Mike Daniels

3
คำถามไม่ได้แยกความแตกต่างระหว่างค่าใดค่าหนึ่งหรือสองค่าทั้งสองค่าสองค่าหรือการประเมินแนวคิดใหม่ที่ขี้เกียจค่าหนึ่งอาจเป็นสองค่าสองค่า สิ่งแรกนั้นไม่สำคัญกับการไหลตามเงื่อนไขใด ๆ ที่สองได้รับอนุญาตในหลาม: q, r = divmod (x, y); เช่นเดียวกับเสียงกระเพื่อม; PHP ต้องการรายการ ($ q, $ r) = twovals (); แฮ็คที่ฟังก์ชัน twovals () {return array ($ a, $ b); } การประเมิน Lazy ค่อนข้างสูงและยังไม่ติดใน PHP เนื่องจากคำถามไม่แม่นยำแนะนำให้อย่าใช้รายการนี้เป็นการอ้างอิงแบบละเอียดสำหรับหัวข้อนี้
DragonLord

5
หากคุณต้องการค่าทั้งสองให้ส่งคืนในอาร์เรย์
Bhargav Nanekalva

2
@DragonLord ใน PHP 7.1 คุณสามารถใช้ไวยากรณ์ลิสต์แบบสั้นได้
Janus Troelsen

1
มีคำถามซ้ำ แต่ด้วยความรัดกุมมากขึ้นคำตอบจึงจะได้รับคุณได้เร็วขึ้นไปยังจุดที่: กลับมา 2 ค่าจากฟังก์ชั่น
Gras Double

คำตอบ:


161

ไม่มีวิธีคืนค่า 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 มี Perl เท่านั้นwantarray()
Marc B

7
IMHO คำตอบนี้จะได้รับการปรับปรุงหากไม่ได้ใส่ส่วนแรกไว้ซึ่งจะอธิบายถึงวิธีการคืนค่าหนึ่งหรือค่าที่แตกต่างขึ้นอยู่กับเงื่อนไขบางประการ ฉันมั่นใจว่า 99.999 +% ของผู้ที่เข้าร่วมการสนทนาต้องการทราบวิธีการคืนค่าทั้งสองในเวลาเดียวกัน ดูคำตอบที่โหวตสูงสุด
ToolmakerSteve

403

ในทางเทคนิคคุณไม่สามารถส่งคืนค่ามากกว่าหนึ่งค่า อย่างไรก็ตามมีหลายวิธีในการแก้ไขข้อ จำกัด ดังกล่าว วิธีที่ใช้งานได้ดีที่สุดเช่นการคืนค่าหลายค่านั้นอยู่ที่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');
bjudson

1
นั่นคือตัวเลือกอื่น แต่ฉันไม่รู้สึกว่าจะคืนค่าหลายค่าเช่นเดียวกับการคืนค่าอาร์เรย์ นั่นอาจเป็นฉัน โดยส่วนตัวฉันจะพบว่าreturn array('x' => $x, 'y' => $y, 'z' => $z)สะอาดกว่า แต่ถึงจุดที่ฉันจะเขียนด้วยตัวเองไม่ใช่จุดที่ฉันจะขอให้ผู้อื่นใช้รูปแบบนั้น
แจสเปอร์

2
การใช้ List () เป็นคำตอบที่ดีสำหรับปัญหา Simular ที่ฉันมี นี่เป็นวิธีที่ยอดเยี่ยมในการตรวจสอบและส่งกลับตัวแปรหลาย ๆ ตัวกลับเข้าไปในฟังก์ชัน การดูเอกสาร php อย่างรวดเร็วจะทำให้ฟังก์ชั่นนี้สว่างขึ้นและอาจทำให้ชัดเจนยิ่งขึ้น php.net/manual/th/function.list.php .. ขอบคุณ Jasper!
JustinP

2
+1 สำหรับคำตอบที่กว้างขวางเช่นนี้โดยเฉพาะคำถามทั่วไปที่กว้างขวาง คำตอบนี้ช่วยฉันอย่างมาก
Lee Blake

2
@ Mikey เหตุผลทางประวัติศาสตร์ คำตอบนี้ถูกโพสต์ในคำถามที่แตกต่างกันซึ่งถูกลบเนื่องจากการทำซ้ำที่แน่นอนของคำถามนี้ (แม้ว่าข้อเท็จจริงที่ว่ามันเก่ากว่าจริง) คำตอบถูกย้ายไปยังคำถามนี้ช้ากว่าการเยี่ยมชมครั้งสุดท้ายของผู้ที่ถามคำถามนี้
Jasper

73

ในตัวอย่างของคุณผลตอบแทนที่สองจะไม่เกิดขึ้น - ผลตอบแทนแรกคือสิ่งสุดท้ายที่ PHP จะทำงาน หากคุณต้องการส่งคืนค่าหลายค่าให้ส่งคืนอาร์เรย์:

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);
Tim Cooper

@ Tim คูเปอร์: result_2หรือ$result_2?
ปีเตอร์มอร์เทนเซ่น

@PeterMortensen:$result_2
Tim Cooper

47

ตั้งแต่ 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 จะมีคุณสมบัติเช่น 'คำตอบที่โดดเด่น' แม้ว่าจะไม่ได้รับการยอมรับในช่วงเวลาของการสร้างคำถามเพราะคำตอบนี้ที่นี่ค่อนข้างมีประโยชน์และได้รับการปรับปรุง แต่แน่นอนว่าเป็นหัวข้อนอกหัวข้อ
Jonatas CD

3
@JonatasCD - ไม่แน่ใจว่าทำไมคุณพูดคำตอบนี้คือ "นอกหัวข้อ" ใน php 7.1 เป็นวิธีที่สะดวกที่สุดในการสร้างและจัดการค่าส่งคืนหลายค่าจากฟังก์ชัน ดังนั้นสำหรับ php เวอร์ชั่นใหม่มันเป็นคำตอบที่เหนือกว่าคำตอบที่ได้รับการยอมรับดั้งเดิม
ToolmakerSteve

@ToolmakerSteve ฉันคิดว่าคุณเข้าใจฉันผิด "off-topic" สำหรับคำถามคือข้อเสนอแนะของฉันในการเปลี่ยนสิ่งที่เป็นคำถามที่ยอมรับได้โดยพิจารณาจากการใช้งานในอนาคต มันไม่มีอะไรเทียบกับคำตอบของคุณ;)
Jonatas CD

@JonatasCD - Ahh ที่อธิบายไว้ (ไม่ใช่คำตอบของฉันฉันแค่สับสน) อย่างน้อยแท็กที่บอกว่า "นี่เป็นคำที่ทันสมัยกว่าคำตอบที่ยอมรับ" บางทีคนสามคนอาจจะเห็นด้วยกับแท็กนั้น :)
ToolmakerSteve

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เพื่อหลีกเลี่ยงความขัดแย้ง
ToolmakerSteve

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

มันเป็นไปไม่ได้ที่จะมีสองข้อความสั่งคืน อย่างไรก็ตามมันไม่ได้เกิดข้อผิดพลาด แต่เมื่อมีการเรียกใช้ฟังก์ชั่นคุณจะได้รับเฉพาะค่าข้อความสั่งคืนแรกเท่านั้น เราสามารถใช้ return of array เพื่อรับค่าหลายค่าตอบแทน ตัวอย่างเช่น:

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

คุณสามารถส่งคืนได้หนึ่งตัวแปรเท่านั้นซึ่งอาจเป็นอาร์เรย์ แต่คุณสามารถเปลี่ยนตัวแปรทั่วโลกจากภายในฟังก์ชั่น นั่นคือเวลาส่วนใหญ่ไม่ใช่สไตล์ที่ดีมาก แต่ใช้งานได้ ในชั้นเรียนคุณมักจะเปลี่ยน varbiables ชั้นเรียนจากภายในฟังก์ชั่นโดยไม่ต้องกลับพวกเขา


1

คำตอบคือไม่ เมื่อ parser มาถึงคำสั่ง return แรกคำสั่งนั้นจะควบคุมกลับไปยังฟังก์ชันการเรียก - คำสั่ง return ที่สองของคุณจะไม่ถูกดำเนินการ


พูดอย่างเคร่งครัดใช่ แต่คำถามนั้นคลุมเครือ บางทีความตั้งใจที่จะคืนค่าสองค่าจากการเรียกฟังก์ชันหนึ่งครั้ง
ปีเตอร์มอร์เทนเซ่น

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

ฉันคิดว่า eliego ได้อธิบายคำตอบไว้อย่างชัดเจนแล้ว แต่ถ้าคุณต้องการคืนค่าทั้งสองให้ใส่ไว้ในอาร์เรย์และส่งคืน

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

แก้ไขปัญหา
Gihan De Silva

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

ภาษาที่อนุญาตให้ส่งคืนได้หลายครั้งโดยปกติจะแปลงค่าหลายค่าเป็นโครงสร้างข้อมูล

ตัวอย่างเช่นใน Python คุณสามารถคืนค่าได้หลายค่า อย่างไรก็ตามพวกเขาจะถูกส่งกลับเป็นหนึ่ง tuple

ดังนั้นคุณสามารถคืนค่าหลาย ๆ ค่าใน PHP เพียงแค่สร้างอาร์เรย์อย่างง่ายและส่งคืนค่านั้น


0

คุณสามารถรับค่าของตัวแปรตั้งแต่สองตัวขึ้นไปโดยการตั้งค่าโดยอ้างอิง:

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


t($a, $b);

echo $a . '  ' . $b;

เอาท์พุท:

1 2

เรื่อง"รับค่าของตัวแปรสองตัวหรือมากกว่า" : คุณหมายถึง"return value ของตัวแปรสองตัวหรือมากกว่า"หรือไม่?
Peter Mortensen

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

ฉันมีปัญหาที่คล้ายกัน - ดังนั้นฉันจึงพยายามไปและ googled เล็กน้อย (ค้นหาหัวข้อนี้) หลังจากลอง 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
สิ่งนี้ไม่ถูกต้อง 'AND' เป็นเพียงโอเปอเรเตอร์บูลีนดังนั้นฟังก์ชันของคุณจะส่งคืนค่าบูลีนเดียว เหตุผลเดียวที่ทำให้ใช้งานได้คือคุณกำลังประกาศ $ b_id และ $ f_id เป็นตัวแปรทั่วโลก ลบคำว่า 'AND' และคำสั่ง return ทั้งหมดออกมาและคุณจะเห็นว่าผลลัพธ์ของคุณยังคงเหมือนเดิม
สไตล์ของแมตต์

นี่เป็นสิ่งที่ทำให้เข้าใจผิดมากเนื่องจากคุณประกาศ $ b_id และ $ f_id ทั่วโลกดังนั้นจึงพร้อมใช้งานจากบริบทใด ๆ
paulus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.