是否可以有一个具有两个返回的函数,例如:

function test($testvar)
{
  // Do something

  return $var1;
  return $var2;
}


如果是这样,我如何能够分别获得每个返回?

评论

您到底想完成什么?当然,如果您解释了真正的问题,那么这里的人可以帮助您找到一个优雅的解决方案。

问题不区分两个值中的一个或一个,两个值中的两个,或新概念懒惰评估中的一个,然后可能是两个值中的两个。第一个对于任何类型的条件流都是微不足道的。 python中允许使用第二个:q,r = divmod(x,y);以及Lisp; PHP需要list($ q,$ r)= twovals(); hack,其中函数twovals(){返回array($ a,$ b); }。惰性评估相当先进,尚未在PHP上流行。由于问题不明确,建议不要将此条目用作该主题的权威参考。

如果需要两个值,则将它们返回到数组中。

在PHP 7.1中使用@DragonLord,可以使用简短列表语法

这里有一个重复的问题,但是答案更加简洁,因此可以使您更快地了解问题:从函数返回2个值。

#1 楼

无法返回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


如果两者都想要,则可以稍作修改

评论


如果只有PHP具有Perl的wantarray()

– Marc B
10年8月26日在22:22

恕我直言,如果省略了第一部分,该答案将得到改善,该部分讨论了如何根据某些条件返回一个或另一个值。我敢肯定,参加本次讨论的99.999 +%的人想知道如何同时返回两个值。查看投票最高的答案。

–ToolmakerSteve
19-4-3在21:22



@MarcB如果只有PHP和Perl具有Python自动校正/解偶联-返回a,b,c和a,b,c = func()

–尼尔斯·林德曼
7月24日9:01

@NilsLindemann:php 7.1通过数组解构语法实现:return [$ a,$ b,$ c];和[$ x,$ y,$ z] = func();。 (这比Python语法少了许多字符,并且是在PHP中实现该结果的预期方式。实际上,PHP始终具有等效的功能,只需要稍微冗长的语法即可。)

–ToolmakerSteve
12月21日23:16



#2 楼

从技术上讲,您不能返回多个值。但是,有多种方法可以解决该限制。最类似于返回多个值的方式是使用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本身定义的某些函数中(例如str_replace中的$count,preg_match中的$matches)。这可能与返回多个值完全不同,但是至少值得一提。
第三种方法是使用对象来保存所需的不同值。这是更多类型的输入,因此不像上面的两种方法那样经常使用。但是,在多个地方使用相同的变量集时(或者,当然,使用不支持上述方法的语言或无需额外输入即可执行此操作的语言),使用此方法可能会有意义。
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[0];
$y = $array[1];
$z = $array[2];

关于上面的代码,最有趣的部分是该函数内部的代码与我提供的第一个示例相同。仅调用该函数的代码已更改。这意味着最多由一个调用函数的人处理函数返回的结果。
或者,可以使用关联数组:
function getXYZ()
{
    return array('x' => 4,
                 'y' => 5,
                 'z' => 6);
}

$array = getXYZ();

$x = $array['x'];
$y = $array['y'];
$z = $array['z'];
您可以执行与上述相同的操作,但是编写的代码更少。 (好吧,示例中的代码不会更少,但是实际应用程序中可能会更少。)但是,我认为类型保存的数量很少,这使得代码更难阅读,所以我自己不会这样做。不过,这里有一个示例:
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确实在compact中有一​​个对应项,可以在此处调用代码中使用,但是使用它是一个坏主意(特别是对于这样简单的东西)我什至不提供示例。问题是它会为您“神奇”并创建变量,而您无需查看代码的其他部分就看不到创建了哪些变量。
最后,我想提一句extract不会确实可以很好地与关联数组一起玩。以下内容将满足您的期望:
function getXYZ()
{
    return array('x' => 4,
                 'y' => 5,
                 'z' => 6);
}

$array = getXYZ();

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

但是,以下内容会有所不同:将来被调用函数中的代码(可能在任何情况下都可能发生)可能会突然中断,所以我建议不要将list与关联数组结合使用。

评论


同样:return compact('var1','var2','var3');

– bjudson
2010年8月26日在22:37

那是另一种选择,但是对我来说,返回多个值就像返回数组一样。那可能只是我。就个人而言,我会发现return array('x'=> $ x,'y'=> $ y,'z'=> $ z)更加干净,但是到了我自己写的地步,而不是我会请其他人使用这种格式。

–碧玉
10年8月26日在22:54

使用List()是我遇到的类似问题的好答案。这是验证并将多个变量返回到函数中的绝佳方法。快速查看php文档将为该功能提供更多的信息,并且可能使其更加清晰。 php.net/manual/en/function.list.php ..谢谢Jasper!

– JustinP
2012年10月19日在20:22



+1代表如此广泛的答案,尤其是针对如此广泛的一般性问题。尽管如此,这个答案还是极大地帮助了我。

–李·布莱克
2014年9月2日在18:15

@Mikey的历史原因。该答案最初发布在另一个问题上,由于与该问题完全相同而被删除(尽管它实际上更老了)。在提出这个问题的人的最后一次拜访之后,才将答案转移到了这个问题上。

–碧玉
17年5月1日晚上8:42

#3 楼

在您的示例中,第二个返回将永远不会发生-第一个返回是PHP将运行的最后一件事。如果需要返回多个值,请返回一个数组:

function test($testvar) {

    return array($var1, $var2);
}

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


评论


您也可以执行以下操作:list($ result_1,result_2)= test($ testvar);

–蒂姆·库珀(Tim Cooper)
2010年8月10日18:00



@Tim Cooper:result_2或$ result_2?

– Peter Mortensen
19/12/12在20:37

@PeterMortensen:$ result_2

–蒂姆·库珀(Tim Cooper)
19/12/12在20:45

#4 楼

从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的新功能页面:

新功能功能

评论


我希望即使问题创建时尚未接受StackOverflow之类的功能,例如“功能性答案”,因为此处的答案非常有用且已更新,但这当然是题外话。

– Jonatas CD
19 Mar 9 '19 at 20:43

@JonatasCD-不知道为什么您说这个答案是“题外话”。在php 7.1中,这是从函数创建和处理多个返回值的最便捷方法。因此,对于较新的php版本,它是对原始已接受答案的出色答案。

–ToolmakerSteve
19年4月3日在21:13



@ToolmakerSteve我想你误会了我。我对这个问题“脱题”是我的建议,就是能够根据将来的实现方式更改什么是公认的问题。这与您的回答无异;)

– Jonatas CD
19年4月4日在15:10

@JonatasCD-解释了。 (这不是我的答案,只是让我感到困惑。)至少一个标签上写着“这比接受的答案更新得多”,也许三个人必须同意该标签,然后它才能成为特色。 :)

–ToolmakerSteve
19-4-4在18:31



#5 楼

在PHP 5.5中,还有一个新概念:generators,您可以在其中从一个函数产生多个值:

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

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


#6 楼

或者您可以通过引用传递:

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


#7 楼

从PHP 7.1.0开始,您可以使用新语法(而不是list函数):
 /**
* @return  array  [foo, bar]
*/
function getFooAndBar(): array {
    return ['foo', 'bar'];
}

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

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

 

我是否要返回2-3个变量,否则应使用具有所需属性的对象。

#8 楼

我知道我来晚了,但是有一个很好而简单的解决方案。
可以使用解构一次返回多个值。

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


现在,您可以使用此功能了。

$result = test();
extract($result);
为数组中的每个成员创建一个变量,以该成员命名。因此,您现在可以访问extract$model

评论


注意:请注意,键(此处为模型和数据)尚未作为变量存在。如果是这样,请使用extract的prefix参数避免冲突。

–ToolmakerSteve
19年4月3日在21:17

#9 楼

您可以从函数返回多个数组和标量

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


#10 楼

它不可能有两个return语句。但是它不会引发错误,但是在调用函数时,您只会收到第一个return语句值。
我们可以使用array的return来获取多个return值。例如:

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


#11 楼

最佳实践是将返回的变量放入数组,然后使用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 />';

?>


#12 楼

根据定义,函数只能返回一个值。

但是,正如您所假定的那样,该值可以是一个数组。 >
<?PHP
function myfunc($a,$b){
   return array('foo'=>$a,'bar'=>$b);
}
print_r(myfunc('baz','bork'));


话虽如此,值得花点时间思考一下您要解决的问题。虽然返回一个复杂的结果值(例如数组或对象)是完全有效的,但是如果您认为“我想返回两个值”,则可能设计得很差。如果您的问题中没有更多细节,这很难说,但是停下来三思而后行也无济于事。

#13 楼

上面绿色勾号给出的答案实际上是错误的。如果返回数组,则可以在PHP中返回多个值。请参见以下代码作为示例:

<?php

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

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


该代码实际上是从PHP网站的以下页面复制的:http://php.net/manual/zh/ functions.returning-values.php
我本人也多次使用相同的代码,因此可以确认它是好的并且可以工作。

评论


该答案涉及问题中的代码示例,因此它并非严格错误。但是这个问题是模棱两可的。目的可能是从一个函数调用中返回两个值。

– Peter Mortensen
19/12/12在21:22



#14 楼

是的,您可以使用一个对象:-)

,但是最简单的方法是返回一个数组:

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


#15 楼

我已经为多个返回值PHP函数实现了这样的实现。对您的代码好。谢谢。

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


#16 楼

PHP中的函数只能返回一个变量。您可以使用具有全局作用域的变量,可以返回数组,也可以通过引用该函数来传递变量,然后更改值,..但是所有这些都会降低代码的可读性。
我建议您研究一下课程。

#17 楼

我想我将从上面的一些回答中进行扩展。...

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(错误=无错误)。
希望这会有所帮助!

#18 楼

有些人可能更喜欢返回多个值作为对象:

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

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

    return $object;
}


并这样称呼它:

echo test()->x;


或:

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


#19 楼

是的,没有。您不能返回多个变量/对象,但是如您建议的那样,您可以将它们放入数组中并返回。

数组的嵌套没有限制,因此您可以将它们打包成返回的形式。

#20 楼

您始终只能返回一个可能是数组的变量。但是您可以从函数内部更改全局变量。多数情况下,那不是很好的风格,但确实有效。在类中,通常可以从函数内部更改类可变量而不返回它们。

#21 楼

答案是不。当解析器到达第一个return语句时,它将控制权返回给调用函数-您的第二个return语句将永远不会执行。

评论


严格来说,是的。但是这个问题是模棱两可的。可能的目的是从一个函数调用中返回两个值。

– Peter Mortensen
19/12/12在20:49



#22 楼

将所有变量添加到数组中,然后最终返回array

#23 楼

我认为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'];


评论


写这篇文章时您清醒吗?我一眼就能发现两个错误。 1)您使用$ this关键字,但未提及任何类或对象。 2)如果将值返回到变量$ returned_values中,则应从该变量回显:echo $ returned_values ['var1'];

– dading84
17年6月27日在12:57

解决了这个问题。

– Gihan De Silva
19 Mar 26 '19 at 11:26

#24 楼

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

?>


#25 楼

允许多次返回的语言通常只会将多个值转换为数据结构。例如,在Python中,您可以返回多个值。但是,它们实际上只是作为一个元组返回。

,因此您可以通过创建一个简单的数组并将其返回来在PHP中返回多个值。

#26 楼

您可以通过参考设置两个或多个变量的值:

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


t($a, $b);

echo $a . '  ' . $b;


输出:

1 2


评论


关于“获取两个或多个变量的值”:您的意思是“返回两个或多个变量的值”吗?

– Peter Mortensen
19年12月12日在20:51

#27 楼

PHP是否仍然使用“输出参数”?如果是这样,则可以使用语法来修改函数中使用的一个或多个参数。函数返回后,您将可以自由使用修改后的变量。

#28 楼

$var1 = 0;
$var2 = 0;

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

// var1 = 1, var2 = 2 



这不是一个好方法,但是我认为我们可以在一个函数中同时设置两个变量。

#29 楼

这是最简单的方法:

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


而已。很简单。

#30 楼

我有一个类似的问题-所以我尝试了一下并用Google搜索了一下(找到此线程)。经过5分钟的尝试和错误后,我发现您可以简单地使用
“ AND”在一行返回中返回两个(也许更多-尚未测试)。

我的代码:

  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


它起作用。我得到了我期望/应该获得的两个价值。我希望我能帮助任何人阅读此主题:)

评论


这是不正确的。 “ AND”只是一个布尔运算符,因此您的函数实际上返回一个布尔值。它似乎起作用的唯一原因是因为您将$ b_id和$ f_id声明为全局变量。完全删除“ AND”和return语句,您将看到结果保持不变。

–马特风格
15年2月19日在6:34

这是非常令人误解的,因为您声明了$ b_id和$ f_id全局,因此可以在任何上下文中使用。

– paulus
2015年7月1日在20:08