Nhiều trả về từ một hàm


198

Có thể có một hàm với hai trả về như thế này:

function test($testvar)
{
  // Do something

  return $var1;
  return $var2;
}

Nếu vậy, làm thế nào tôi có thể nhận được mỗi lần trả lại một cách riêng biệt?


1
Chính xác thì bạn đang cố đạt được điều gì? Chắc chắn nếu bạn giải thích vấn đề thực sự của mình, ai đó ở đây có thể giúp bạn đi đến một giải pháp tao nhã.
Mike Daniels

3
Câu hỏi không phân biệt giữa một hoặc một trong hai giá trị, cả hai giá trị hoặc khái niệm mới lười biếng đánh giá một sau đó có thể là hai trong hai giá trị. Đầu tiên là tầm thường với bất kỳ loại dòng chảy có điều kiện. Thứ hai được cho phép trong python: q, r = divmod (x, y); cũng như Lisp; PHP yêu cầu danh sách ($ q, $ r) = twovals (); hack, trong đó hàm twovals () {return mảng ($ a, $ b); }. Đánh giá lười biếng là khá tiên tiến và chưa được bắt gặp trong PHP. Vì câu hỏi không chính xác, khuyên bạn không nên sử dụng mục này làm tài liệu tham khảo chính xác cho chủ đề này.
DragonLord ngày

5
Nếu bạn cần cả hai giá trị, trả về chúng trong một mảng.
Bhargav Nanekalva

2
@DragonLord trong PHP 7.1, bạn có thể sử dụng cú pháp danh sách ngắn
Janus Troelsen

1
Có một câu hỏi trùng lặp, nhưng với câu trả lời ngắn gọn hơn, do đó nó sẽ giúp bạn nhanh hơn đến điểm: Trả lại 2 giá trị từ một hàm .
Gras Double

Câu trả lời:


162

Không có cách nào trả về 2 biến. Mặc dù, bạn có thể truyền một mảng và trả về nó; tạo một điều kiện để trả về một biến động, v.v.

Chẳng hạn, hàm này sẽ trả về $var2

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

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

Trong ứng dụng:

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

Nếu bạn muốn cả hai, bạn có thể sửa đổi chức năng một chút

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
Giá như PHP có Perl'swantarray()
Marc B

6
IMHO câu trả lời này sẽ được cải thiện nếu nó bỏ qua phần đầu tiên, trong đó thảo luận về cách trả về một hoặc một giá trị khác, tùy thuộc vào một số điều kiện. Tôi chắc chắn rằng 99.999 +% số người tham gia cuộc thảo luận này muốn biết cách trả lại cả hai giá trị cùng một lúc. Xem câu trả lời bình chọn cao nhất.
ToolmakerSteve

401

Về mặt kỹ thuật, bạn không thể trả lại nhiều hơn một giá trị. Tuy nhiên, có nhiều cách để khắc phục hạn chế đó. Cách hoạt động giống như trả về nhiều giá trị, là với listtừ khóa:

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)

Về mặt kỹ thuật, bạn đang trả về một mảng và sử dụng listđể lưu trữ các phần tử của mảng đó trong các giá trị khác nhau thay vì lưu trữ mảng thực tế. Sử dụng kỹ thuật này sẽ làm cho nó cảm thấy giống như trả lại nhiều giá trị.

Các listgiải pháp là một trong những thay php cụ thể. Có một vài ngôn ngữ có cấu trúc tương tự, nhưng nhiều ngôn ngữ thì không. Có một cách khác thường được sử dụng để "trả lại" nhiều giá trị và nó có sẵn ở mọi ngôn ngữ (bằng cách này hay cách khác). Tuy nhiên, phương pháp này sẽ trông khá khác nhau nên có thể cần một số làm quen.

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

Kỹ thuật này cũng được sử dụng trong một số chức năng được xác định bởi chính php (ví dụ: $counttrong str numplace , $matchestrong preg_match ). Điều này có thể cảm thấy khá khác với việc trả lại nhiều giá trị, nhưng ít nhất nó cũng đáng để biết.

Phương pháp thứ ba là sử dụng một đối tượng để giữ các giá trị khác nhau mà bạn cần. Đây là cách gõ nhiều hơn, vì vậy nó không được sử dụng thường xuyên như hai phương pháp trên. Tuy nhiên, có thể có ý nghĩa khi sử dụng điều này khi sử dụng cùng một bộ biến ở một số nơi (hoặc tất nhiên, làm việc trong một ngôn ngữ không hỗ trợ các phương pháp trên hoặc cho phép bạn thực hiện việc này mà không cần nhập thêm).

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;

Các phương thức trên tổng hợp các cách chính để trả về nhiều giá trị từ một hàm. Tuy nhiên, có những biến thể về các phương pháp này. Các biến thể thú vị nhất để xem xét, là những biến thể mà bạn thực sự trả về một mảng, đơn giản là vì có rất nhiều thứ bạn có thể làm với các mảng trong PHP.

Đầu tiên, chúng ta chỉ có thể trả về một mảng và không coi nó là bất cứ thứ gì ngoại trừ một mảng:

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

$array = getXYZ();

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

Phần thú vị nhất về mã ở trên là mã bên trong hàm giống như trong ví dụ đầu tiên tôi cung cấp; chỉ có mã gọi hàm thay đổi. Điều này có nghĩa là tùy thuộc vào cách gọi hàm làm thế nào để xử lý kết quả mà hàm trả về.

Ngoài ra, người ta có thể sử dụng một mảng kết hợp:

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

$array = getXYZ();

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

Php có compact chức năng cho phép bạn làm tương tự như trên nhưng trong khi viết ít mã hơn. (Chà, mẫu sẽ không có ít mã hơn, nhưng một ứng dụng trong thế giới thực có thể sẽ có.) Tuy nhiên, tôi nghĩ rằng mức độ tiết kiệm gõ là tối thiểu và nó làm cho mã khó đọc hơn, vì vậy tôi sẽ không tự làm điều đó. Tuy nhiên, đây là một mẫu:

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

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

$array = getXYZ();

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

Cần lưu ý rằng trong khi compactcó một đối tác trongextract có thể được sử dụng trong mã gọi ở đây, nhưng vì đó là một ý tưởng tồi để sử dụng nó (đặc biệt đối với một cái gì đó đơn giản như thế này) tôi thậm chí sẽ không đưa ra một mẫu cho nó. Vấn đề là nó sẽ thực hiện "phép thuật" và tạo các biến cho bạn, trong khi bạn không thể thấy biến nào được tạo mà không đi đến các phần khác của mã.

Cuối cùng, tôi muốn đề cập rằng listkhông thực sự chơi tốt với mảng kết hợp. Sau đây sẽ làm những gì bạn mong đợi:

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

$array = getXYZ();

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

Tuy nhiên, sau đây sẽ làm một cái gì đó khác nhau:

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

$array = getXYZ();

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

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

Nếu bạn đã sử dụng listvới một mảng kết hợp và người khác phải thay đổi mã trong hàm được gọi trong tương lai (điều này có thể xảy ra với bất kỳ tình huống nào) thì nó có thể đột ngột bị hỏng, vì vậy tôi khuyên bạn không nên kết hợp listvới mảng kết hợp.


2
Ngoài ra: return compact ('var1', 'var2', 'var3');
bjudson

1
Đó là một tùy chọn khác, nhưng đối với tôi, nó không mang lại nhiều giá trị, giống như trả về một mảng. Đó chỉ có thể là tôi. Cá nhân, tôi sẽ tìm thấy return array('x' => $x, 'y' => $y, 'z' => $z)sạch hơn, nhưng đến mức tôi sẽ tự viết nó, không đến mức tôi sẽ yêu cầu người khác sử dụng định dạng đó.
Jasper

2
Sử dụng Danh sách () là một câu trả lời tuyệt vời cho một vấn đề mô phỏng mà tôi đã có. đây là một cách tuyệt vời để xác nhận và trả lại nhiều biến vào một hàm. một cái nhìn nhanh về các tài liệu php sẽ làm sáng tỏ hơn về chức năng này và có lẽ làm cho nó rõ ràng hơn. php.net/manual/en/feft.list.php .. cảm ơn Jasper!
JustinP

2
+1 cho một câu trả lời mở rộng như vậy, đặc biệt là một câu hỏi chung chung, rộng lớn như vậy. Mặc dù vậy, câu trả lời này đã giúp tôi rất nhiều.
Lee Blake

2
@Mikey Lý do lịch sử. Câu trả lời này ban đầu được đăng trên một câu hỏi khác, đã bị xóa vì là một bản sao chính xác của câu hỏi này (mặc dù thực tế là nó thực sự cũ hơn). Câu trả lời đã được chuyển đến câu hỏi này muộn hơn so với chuyến thăm cuối cùng của người hỏi câu hỏi này.
Jasper

73

Trong ví dụ của bạn, lần trả lại thứ hai sẽ không bao giờ xảy ra - lần trả lại đầu tiên là điều cuối cùng PHP sẽ chạy. Nếu bạn cần trả về nhiều giá trị, trả về một mảng:

function test($testvar) {

    return array($var1, $var2);
}

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

18
Bạn cũng có thể làm:list($result_1, result_2) = test($testvar);
Tim Cooper

@Tim Cooper: result_2hay $result_2?
Peter Mortensen

@PeterMortensen:$result_2
Tim Cooper

46

Kể từ PHP 7.1, chúng tôi có sự phá hủy thích hợp cho các danh sách. Qua đó bạn có thể làm những việc như thế này:

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

Trong một chức năng, nó sẽ trông như thế này:

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

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

Phá hủy là một công cụ rất mạnh mẽ. Nó cũng có khả năng phá hủy khóa => cặp giá trị:

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

Hãy xem trang tính năng mới cho PHP 7.1:

Các tính năng mới


5
Tôi ước StackOverflow sẽ có một tính năng như 'câu trả lời nổi bật' ngay cả khi không được chấp nhận vào thời điểm tạo câu hỏi vì câu trả lời này ở đây khá hữu ích và được cập nhật, nhưng tất nhiên nó không có chủ đề.
CD Jonatas

3
@JonatasCD - không chắc tại sao bạn nói câu trả lời này là "lạc đề". Trong php 7.1, đây cách thuận tiện nhất để tạo và xử lý nhiều giá trị trả về từ một hàm. Vì vậy, đối với các phiên bản php mới hơn, đây là một câu trả lời vượt trội so với câu trả lời được chấp nhận ban đầu.
ToolmakerSteve

@ToolmakerSteve Tôi nghĩ bạn đã hiểu lầm tôi. "ngoài chủ đề" cho câu hỏi là gợi ý của tôi về việc có thể thay đổi câu hỏi được chấp nhận dựa trên các triển khai trong tương lai. Không có gì chống lại câu trả lời của bạn;)
CD Jonatas

@JonatasCD - Ahh mà giải thích nó. (Không phải câu trả lời của tôi, tôi chỉ bối rối.) Ít nhất một thẻ có nội dung "đây là cập nhật hơn câu trả lời được chấp nhận" Có thể ba người phải đồng ý với thẻ đó, và sau đó nó trở nên nổi bật. :)
ToolmakerSteve

26

Trong PHP 5.5 cũng có một khái niệm mới : generators, nơi bạn có thể mang lại nhiều giá trị từ một hàm:

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

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

16

Hoặc bạn có thể vượt qua bằng cách tham khảo:

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

$a = 0;
$b = 0;

byRef(10, $a, $b);

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

Điều này sẽ xuất

100
1000

9

Tôi biết rằng tôi khá muộn, nhưng có một giải pháp tốt và đơn giản cho vấn đề này.
Có thể trả về nhiều giá trị cùng một lúc bằng cách sử dụng hàm hủy.

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

Bây giờ bạn có thể sử dụng này

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

extracttạo một biến cho mỗi thành viên trong mảng, được đặt tên theo thành viên đó. Do đó bạn có thể truy cập $model$data


1
LƯU Ý: hãy cẩn thận rằng các khóa (ở đây modeldata) không tồn tại dưới dạng các biến. Nếu họ làm, sử dụng prefixtham số của extractđể tránh xung đột.
ToolmakerSteve

7

Bạn có thể trả về nhiều mảng và vô hướng từ một hàm

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

Nó không thể có hai tuyên bố trở lại. Tuy nhiên, nó không ném lỗi nhưng khi hàm được gọi, bạn sẽ chỉ nhận được giá trị câu lệnh trả về đầu tiên. Chúng ta có thể sử dụng trả về mảng để nhận lại nhiều giá trị. Ví dụ:

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

Hàm, theo định nghĩa, chỉ trả về một giá trị.

Tuy nhiên, như bạn đã giả định, giá trị đó có thể là một mảng.

Vì vậy, bạn chắc chắn có thể làm một cái gì đó như:

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

Điều đó nói rằng, đáng để dành một chút thời gian và suy nghĩ về bất cứ điều gì bạn đang cố gắng giải quyết. Mặc dù trả về một giá trị kết quả phức tạp (như một mảng hoặc một đối tượng) là hoàn toàn hợp lệ, nếu bạn nghĩ rằng "Tôi muốn trả về hai giá trị", bạn có thể đang thiết kế kém. Không có nhiều chi tiết hơn trong câu hỏi của bạn, thật khó để nói, nhưng không bao giờ đau lòng để dừng lại và suy nghĩ hai lần.


5

Thực hành tốt nhất là đặt các biến trả về của bạn thành mảng và sau đó sử dụng list()để gán giá trị mảng cho các biến.

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

Có, bạn có thể sử dụng một đối tượng :-)

Nhưng cách đơn giản nhất là trả về một mảng:

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

5

Đối với PHP 7.1 <= bạn có thể sử dụng cú pháp mới (thay vì hàm danh sách ):

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

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

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

Tôi đồng ý với tôi nếu bạn muốn trả về 2-3 biến, nếu không, bạn nên sử dụng một đối tượng có các thuộc tính mong muốn.


4

Tôi đã thực hiện như thế này cho nhiều hàm PHP giá trị trả về. tốt đẹp với mã của bạn. cảm ơn bạn.

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

4

Câu trả lời được đánh dấu màu xanh lá cây ở trên thực sự không chính xác. Bạn có thể trả về nhiều giá trị trong PHP, nếu bạn trả về một mảng. Xem mã sau đây cho một ví dụ:

<?php

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

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

Mã này thực sự được sao chép từ trang sau trên trang web của PHP: http://php.net/manual/en/fifts.retinating-values.php Tôi cũng đã sử dụng cùng một loại mã nhiều lần, vì vậy có thể xác nhận rằng nó tốt và nó hoạt động.


Câu trả lời đó đề cập đến ví dụ mã trong câu hỏi, vì vậy nó không hoàn toàn không chính xác. Nhưng câu hỏi mơ hồ. Mục đích có thể quay trở lại hai giá trị từ một lời gọi hàm.
Peter Mortensen

3

Các hàm trong PHP chỉ có thể trả về một biến. bạn có thể sử dụng các biến có phạm vi toàn cục, bạn có thể trả về mảng hoặc bạn có thể chuyển biến bằng cách tham chiếu đến hàm và thay đổi giá trị, .. nhưng tất cả điều đó sẽ làm giảm khả năng đọc mã của bạn. Tôi muốn đề nghị bạn nhìn vào các lớp học.


3

Nghĩ rằng tôi sẽ mở rộng một vài câu trả lời từ phía trên ....

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>

Điều này sẽ cung cấp cho bạn một trường đầu vào và một nút gửi sau khi gửi, nếu trường nhập tên trống, nó sẽ trả về cờ lỗi và thông báo. Nếu trường tên có giá trị, nó sẽ trả về giá trị / tên và cờ lỗi là 0 cho false = không có lỗi. Hi vọng điêu nay co ich!


3

Một số có thể thích trả về nhiều giá trị dưới dạng đối tượng:

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

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

    return $object;
}

Và gọi nó như thế này:

echo test()->x;

Hoặc là:

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

3

Có và không. Bạn không thể trả lại nhiều hơn một biến / đối tượng, nhưng như bạn đề xuất, bạn có thể đặt chúng vào một mảng và trả về đó.

Không có giới hạn cho việc lồng các mảng, vì vậy bạn chỉ có thể đóng gói chúng theo cách đó để trả về.


2

Bạn luôn có thể chỉ trả về một biến có thể là một mảng. Nhưng bạn có thể thay đổi các biến toàn cục từ bên trong hàm. Đó là hầu hết thời gian không phải là phong cách rất tốt, nhưng nó hoạt động. Trong các lớp, bạn thường thay đổi các biến thể lớp từ bên trong các hàm mà không trả lại chúng.


1

Câu trả lời là không. Khi trình phân tích cú pháp đạt đến câu lệnh return đầu tiên, nó sẽ điều khiển trực tiếp trở lại chức năng gọi - câu lệnh return thứ hai của bạn sẽ không bao giờ được thực thi.


Nói đúng ra là có. Nhưng câu hỏi mơ hồ. Có lẽ ý định là trả về hai giá trị từ một lệnh gọi hàm.
Peter Mortensen

1

Thêm tất cả các biến trong một mảng và cuối cùng trả về array.

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

Và sau đó

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

1

Tôi nghĩ rằng eliego đã giải thích câu trả lời rõ ràng. Nhưng nếu bạn muốn trả về cả hai giá trị, hãy đặt chúng vào một mảng và trả về nó.

function test($testvar)
{
  // do something

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

// để truy cập các giá trị trả về

$returned_values = test($testvar);

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

Bạn có tỉnh táo khi bạn viết điều này? Tôi có thể nhận ra 2 sai lầm trong nháy mắt. 1) Bạn sử dụng $thistừ khóa nhưng không có lớp hoặc đối tượng được đề cập. 2) Nếu bạn trả lại các giá trị vào biến của mình $returned_values, thì bạn nên lặp lại từ biến đó:echo $returned_values['var1'];
dading84

đã khắc phục sự cố.
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

Các ngôn ngữ cho phép trả về nhiều thường chỉ chuyển đổi nhiều giá trị thành cấu trúc dữ liệu.

Ví dụ: trong Python bạn có thể trả về nhiều giá trị. Tuy nhiên, chúng thực sự chỉ được trả lại như một tuple.

Vì vậy, bạn có thể trả về nhiều giá trị trong PHP bằng cách chỉ cần tạo một mảng đơn giản và trả về đó.


0

Bạn có thể nhận các giá trị của hai hoặc nhiều biến bằng cách đặt chúng theo tham chiếu:

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


t($a, $b);

echo $a . '  ' . $b;

Đầu ra:

1 2

Re "nhận giá trị của hai hoặc nhiều biến" : Ý của bạn là "giá trị trả về của hai hoặc nhiều biến" ?
Peter Mortensen

0

PHP vẫn sử dụng "tham số ngoài"? Nếu vậy, bạn có thể sử dụng cú pháp để sửa đổi một hoặc nhiều tham số đi vào chức năng của mình. Sau đó, bạn sẽ được tự do sử dụng biến đã sửa đổi sau khi hàm của bạn trở lại.


-1

Đây là cách dễ nhất để làm điều đó:

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;
    }

}

Làm thế nào chúng ta có thể gọi chức năng này?

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

Đó là nó. Rất dễ.


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

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

// var1 = 1, var2 = 2 

Đó không phải là một cách tốt, nhưng tôi nghĩ rằng chúng ta có thể đặt hai biến trong một hàm cùng một lúc.


-4

Tôi đã có một vấn đề tương tự - vì vậy tôi đã thử xung quanh và googled một chút (tìm chủ đề này). Sau 5 phút thử và lỗi tôi phát hiện ra rằng bạn chỉ cần sử dụng "VÀ" để trả về hai (có thể nhiều hơn - chưa được kiểm tra) trong một dòng trả về.

Mã của tôi:

  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

nó hoạt động Tôi đã nhận được cả hai giá trị mà tôi mong đợi nhận được / nên nhận được. Tôi hy vọng tôi có thể giúp bất cứ ai đọc chủ đề này :)


3
Điều này LAF không đúng. 'AND' chỉ đơn giản là một toán tử boolean, do đó hàm của bạn thực sự trả về một giá trị boolean duy nhất. Lý do duy nhất nó có vẻ hoạt động là vì bạn đang khai báo $ b_id và $ f_id là các biến toàn cục. Xóa 'VÀ' cũng như tuyên bố hoàn trả và bạn sẽ thấy rằng kết quả của mình vẫn giữ nguyên.
Matt Styles

điều này rất sai lệch, vì bạn đã khai báo $ b_id và $ f_id toàn cầu, do đó có sẵn từ bất kỳ bối cảnh nào.
paulus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.