function test($testvar)
{
// Do something
return $var1;
return $var2;
}
如果是这样,我如何能够分别获得每个返回?
#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
评论
您到底想完成什么?当然,如果您解释了真正的问题,那么这里的人可以帮助您找到一个优雅的解决方案。问题不区分两个值中的一个或一个,两个值中的两个,或新概念懒惰评估中的一个,然后可能是两个值中的两个。第一个对于任何类型的条件流都是微不足道的。 python中允许使用第二个:q,r = divmod(x,y);以及Lisp; PHP需要list($ q,$ r)= twovals(); hack,其中函数twovals(){返回array($ a,$ b); }。惰性评估相当先进,尚未在PHP上流行。由于问题不明确,建议不要将此条目用作该主题的权威参考。
如果需要两个值,则将它们返回到数组中。
在PHP 7.1中使用@DragonLord,可以使用简短列表语法
这里有一个重复的问题,但是答案更加简洁,因此可以使您更快地了解问题:从函数返回2个值。