有可能有一个带有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本身定义的一些函数中(例如$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;
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与关联数组组合.
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)
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)
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
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)
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
返回一个数组。
function test($testvar)
{
// Do something
return [$var1, $var2];
}
Run Code Online (Sandbox Code Playgroud)
然后使用如下所示:
[$value1, $value2] = test($testvar);
Run Code Online (Sandbox Code Playgroud)
我知道我已经很晚了,但是对于这个问题有一个很好的简单解决方案.
使用解构可以一次返回多个值.
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
您可以从函数返回多个数组和标量
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)
最佳实践是将返回的变量放入数组,然后用于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)
是的,你可以使用一个对象:-)
但最简单的方法是返回一个数组:
return array('value1','value2','value3','...');
Run Code Online (Sandbox Code Playgroud)
根据定义,函数只返回一个值.
但是,正如您所假设的那样,该值可以是一个数组.
所以你当然可以这样做:
<?PHP
function myfunc($a,$b){
return array('foo'=>$a,'bar'=>$b);
}
print_r(myfunc('baz','bork'));
Run Code Online (Sandbox Code Playgroud)
也就是说,值得花一点时间思考你想要解决的问题.虽然返回一个复杂的结果值(如数组或对象)是完全有效的,但如果您认为"我想返回两个值",那么您可能设计得很差.在你的问题中没有更多的细节,很难说,但是停下来三思而后行永远不会伤害.
我已经实现了这样的多返回值 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 我自己也多次使用相同类型的代码,因此可以确认这很好,而且有效。