函数多次返回

vin*_*ent 179 php

有可能有一个带有2个返回的函数,如下所示:

function test($testvar)
{
  // do something

  return $var1;
  return $var2;
}
Run Code Online (Sandbox Code Playgroud)

如果是这样,我怎么能分别得到每个回报?

Jas*_*per 381

从技术上讲,您不能返回多个值.但是,有多种方法可以解决这个限制.最像回复多个值的方式是使用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)
Run Code Online (Sandbox Code Playgroud)

从技术上讲,您将返回一个数组并用于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);
Run Code Online (Sandbox Code Playgroud)

这种技术也用于php本身定义的一些函数中(例如$countstr_replace中,$matchespreg_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;
Run Code Online (Sandbox Code Playgroud)

上述方法总结了从函数返回多个值的主要方法.但是,这些方法有所不同.要看的最有趣的变体是那些实际返回数组的变体,因为你可以用PHP中的数组做很多事情.

首先,我们可以简单地返回一个数组,而不是将它视为一个数组:

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

$array = getXYZ();

$x = $array[1];
$y = $array[2];
$z = $array[3];
Run Code Online (Sandbox Code Playgroud)

关于上面代码最有趣的部分是函数内部的代码与我提供的第一个例子中的代码相同; 只有调用函数的代码发生了变化.这意味着由调用函数的人如何处理函数返回的结果.

或者,可以使用关联数组:

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

$array = getXYZ();

$x = $array['x'];
$y = $array['y'];
$z = $array['z'];
Run Code Online (Sandbox Code Playgroud)

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'];
Run Code Online (Sandbox Code Playgroud)

应该注意的是,虽然compact确实有一个对应物extract可以在这里使用调用代码,但是因为使用它是一个坏主意(特别是对于像这样简单的东西)我甚至不会给它一个样本.问题是它会做"魔术"并为你创建变量,而你无法看到哪些变量是在没有去代码的其他部分的情况下创建的.

最后,我想提一下,关联数组list并不能很好地发挥作用.以下将满足您的期望:

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

$array = getXYZ();

list($x, $y, $z) = getXYZ();
Run Code Online (Sandbox Code Playgroud)

但是,以下将做一些不同的事情:

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

$array = getXYZ();

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

// Pay attention: $y == 6 && $z == 5
Run Code Online (Sandbox Code Playgroud)

如果您使用list关联数组,并且其他人必须在将来更改被调用函数中的代码(这可能发生在任何情况下),它可能会突然中断,所以我建议不要list与关联数组组合.

  • 另外:return compact('var1','var2','var3'); (2认同)
  • 使用List()是我遇到的类似问题的一个很好的答案.这是验证函数并将多个变量返回函数的绝佳方法.快速浏览一下php文档将会对这个函数有更多的了解,也许会让它变得更加清晰.http://php.net/manual/en/function.list.php ..谢谢贾斯珀! (2认同)
  • +1这样广泛的答案,特别是对这样一个广泛的一般性问题.尽管如此,这个答案对我帮助很大. (2认同)
  • @earl3s 记录行为,这是一个常见的范例。正如您所看到的我链接到的两个内置函数,这也是 php 本身所做的事情。当然,您通常不应该修改其值作为输入的变量,但是具有不使用其初始值并且其唯一目的是将其值设置为输出的变量是非常正常的事情。请务必将其记录下来(如果它是外部事物)。 (2认同)
  • @Mikey历史原因.这个答案最初发布在一个不同的问题上,该问题被删除,因为它与这个问题完全相同(尽管事实上它实际上已经老了).回答这个问题的时间晚于提出这个问题的人的最后一次访问. (2认同)

doc*_*ryZ 153

无法返回2个变量.虽然,您可以传播一个数组并将其返回; 创建条件以返回动态变量等.

例如,此函数将返回 $var2

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

    if($blahblah === true) {
      return $var2;
    }
    return $var1;
}
Run Code Online (Sandbox Code Playgroud)

在申请中:

echo wtf();
//would echo: tWo
echo wtf("not true, this is false");
//would echo: ONe
Run Code Online (Sandbox Code Playgroud)

如果你想要它们,你可以稍微修改一下这个功能

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
Run Code Online (Sandbox Code Playgroud)

  • wtf()作为一个函数使它有点搞笑! (22认同)
  • 如果只有PHP有Perl的`wantarray()` (14认同)
  • 恕我直言,如果省略第一部分,该答案将得到改进,该部分讨论了如何根据某些条件返回一个 * 或 * 不同的值。我确信 99.999+% 的人都想知道如何同时返回*两个*值。查看投票最高的答案。 (11认同)
  • wtf是该特定函数的一个很好的名称 (8认同)
  • @NilsLindemann:“php 7.1”通过数组解构语法做到了:“return [$a, $b, $c];”和“[$x, $y, $z] = func();”。(这比 Python 语法多了一小部分字符,并且是在 PHP 中实现该结果的预期方法。实际上,PHP 始终具有相同的功能,只是需要稍微更详细的语法。) (2认同)

Tim*_*ain 69

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

function test($testvar) {

    return array($var1, $var2);
}

$result = test($testvar);
echo $result[0]; // $var1
echo $result[1]; // $var2
Run Code Online (Sandbox Code Playgroud)

  • 你也可以这样做:`list($ result_1,result_2)= test($ testvar);` (17认同)

Nuk*_*sor 27

从PHP 7.1开始,我们对列表进行了适当的解构.从而你可以做这样的事情:

$test = [1,2,3,4];
[$a, $b, $c, $d] = $test;
echo($a);
> 1
echo($d);
> 4
Run Code Online (Sandbox Code Playgroud)

在一个函数中,这将是这样的:

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

[$first, $second, $third, $fourth] = multiple_return();
echo($first);
> this
echo($fourth);
> test
Run Code Online (Sandbox Code Playgroud)

解构是一个非常强大的工具.它也能够解析key => value对

["a" => $a, "b" => $b, "c" => $c] = ["a" => 1, "b" => 2, "c" => 3];
Run Code Online (Sandbox Code Playgroud)

看看新的功能页面:http: //php.net/manual/de/migration71.new-features.php

  • 我希望即使问题创建时尚未接受StackOverflow的功能,例如“功能性答案”,因为此处的答案非常有用且已更新,但这当然是题外话了。 (3认同)
  • @JonatasCD - 不知道你为什么说这个答案是“题外话”。在 php 7.1 中,它*是*从函数创建和处理多个返回值的最方便的方法。因此,对于较新的 php 版本,它是原始接受答案的最佳答案。 (3认同)

Szt*_*upY 25

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

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

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

  • 好一个.我将这个技巧添加到我的开发技能箱:) (2认同)

Jak*_*e N 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;
Run Code Online (Sandbox Code Playgroud)

这会输出

100
1000
Run Code Online (Sandbox Code Playgroud)


Mar*_*ski 11

对于 PHP 7.1.0 及更高版本,您可以使用新语法(而不是list函数):

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

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

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

Run Code Online (Sandbox Code Playgroud)

如果你想返回 2-3 个变量对我来说没问题,否则你应该使用具有所需属性的对象。


Hos*_*ein 10

PHP 7.1 更新

返回一个数组。

function test($testvar)
{
  // Do something
  return [$var1, $var2];
}
Run Code Online (Sandbox Code Playgroud)

然后使用如下所示:

[$value1, $value2] = test($testvar);
Run Code Online (Sandbox Code Playgroud)

  • 这与 /sf/answers/4071006271/ 的答案相同,只是下面的 2 个回复。 (2认同)

Muh*_*eel 8

我知道我已经很晚了,但是对于这个问题有一个很好的简单解决方案.
使用解构可以一次返回多个值.

function test()
{
    return [ 'model' => 'someValue' , 'data' => 'someothervalue'];
}
Run Code Online (Sandbox Code Playgroud)

现在你可以使用它了

$result = test();
extract($result);
Run Code Online (Sandbox Code Playgroud)

extract为数组中的每个成员创建一个变量,以该成员命名.因此,您现在可以访问$model$data


zza*_*per 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);
Run Code Online (Sandbox Code Playgroud)


小智 7

它不可能有两个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);
}
Run Code Online (Sandbox Code Playgroud)


Wae*_*saf 6

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

?>
Run Code Online (Sandbox Code Playgroud)


Ruf*_*nus 5

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

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

return array('value1','value2','value3','...');
Run Code Online (Sandbox Code Playgroud)


tim*_*dev 5

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

但是,正如您所假设的那样,该值可以是一个数组.

所以你当然可以这样做:

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

也就是说,值得花一点时间思考你想要解决的问题.虽然返回一个复杂的结果值(如数组或对象)是完全有效的,但如果您认为"我想返回两个值",那么您可能设计得很差.在你的问题中没有更多的细节,很难说,但是停下来三思而后行永远不会伤害.


YeH*_*unZ 5

我已经实现了这样的多返回值 PHP 函数。善待你的代码。谢谢。

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


小智 5

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

<?php

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

list ($zero, $one, $two) = small_numbers();
Run Code Online (Sandbox Code Playgroud)

此代码实际上是从 PHP 网站上的以下页面复制的:http : //php.net/manual/en/functions.returning-values.php 我自己也多次使用相同类型的代码,因此可以确认这很好,而且有效。