一个函数的多个返回值

有可能有一个函数有两个返回值,像这样:

function test($testvar)
{
// Do something


return $var1;
return $var2;
}

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

486501 次浏览

在你的例子中,第二次返回永远不会发生——第一次返回是PHP运行的最后一件事。如果你需要返回多个值,返回一个数组:

function test($testvar) {


return array($var1, $var2);
}


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

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

没有办法返回两个变量。虽然,你< em > < / em >传播一个数组并返回它;创建一个条件返回一个动态变量,等等。

例如,这个函数将返回$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

如果你两个都想要,你可以稍微修改一下函数

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

允许多次返回的语言通常只是将多个值转换为一个数据结构。

例如,在Python中,您可以返回多个值。但是,它们实际上只是作为一个元组返回。

你可以在PHP中返回多个值只需创建一个简单数组并返回。

你可以通过引用来设置两个或多个变量的值:

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




t($a, $b);


echo $a . '  ' . $b;

输出:

1 2

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

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

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

是也不是。你不能返回一个以上的变量/对象,但如你所建议的,你可以把它们放入一个数组并返回。

数组的嵌套是没有限制的,所以您可以将它们打包并返回。

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

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

所以你当然可以这样做:

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

也就是说,无论你想解决什么问题,花点时间想一想都是值得的。虽然返回一个复杂的结果值(如数组或对象)是完全有效的,但如果你的想法是“我想返回两个值”,那么你可能设计得很糟糕。如果你的问题没有更多的细节,这很难说,但停下来三思总是有益无害的。

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

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

你总是只能返回一个变量,它可能是一个数组。但是你可以在函数内部修改全局变量。大多数时候,这不是很好的风格,但它是有效的。在类中,您通常从函数内部更改类变量而不返回它们。

从技术上讲,您不能返回多个值。然而,有多种方法可以绕过这个限制。最类似于返回多个值的方式是使用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中的$countpreg_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'];

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'];

应该注意的是,虽然compactextract中确实有一个对应的对象,可以在这里的调用代码中使用,但由于使用它是一个坏主意(特别是对于像这样简单的事情),我甚至不会给出它的示例。问题是它会有“魔力”。并为你创建变量,而你不能看到哪些变量被创建而不去代码的其他部分。

最后,我想提一下,list不能很好地使用关联数组。以下内容将达到你的期望:

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


$array = getXYZ();


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

但是,下面的方法会有所不同:

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


$array = getXYZ();


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


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

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

PHP中的函数只能返回一个变量。你可以使用全局作用域的变量,你可以返回数组,或者你可以通过引用传递变量给函数,然后改变值。但所有这些都会降低代码的可读性。 我建议你研究一下这些类。

我想eligo已经解释得很清楚了。但如果你想返回两个值,把它们放到一个数组中并返回。

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'];

我想我应该对上面的一些回复进行扩展....

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>
这将为您提供一个输入字段和提交按钮,一旦提交,如果name输入字段为空,它将返回错误标志和一条消息。如果name字段有值,它将返回值/name,如果false =无错误,则返回错误标志0。 希望这能有所帮助!< / p >

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

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


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

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

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);
我也有类似的问题,所以我试了一下,谷歌了一下(找到了这个帖子)。经过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

它的工作原理。我得到了我期望得到/应该得到的两个值。我希望我能帮助到阅读这篇文章的人:)

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

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

像这样使用全局变量:

<?php


function t($a)
{
global $add, $noadd;
$add=$a+$a;
$noadd=$a;
}


$a=1;
t($a);
echo $noadd." ".$add;
?>

这将回显12

不可能有两个return语句。然而,它不会抛出错误,但当函数被调用时,你只会收到第一个返回语句值。 我们可以使用return of array来获取多个返回值。例如:< / p >
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);
}

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

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

然后

$myTest = test($myTestVar);
//$myTest["var1"] and $myTest["var2"] will be usable
<?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


?>

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

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


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


return $object;
}

像这样叫它:

echo test()->x;

或者:

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

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


?>

PHP仍然使用“out参数”吗?如果是这样,那么可以使用该语法修改函数中的一个或多个参数。在函数返回后,您可以自由地使用修改后的变量。

我知道我迟到了,但是对于这个问题有一个很好的简单的解决方法 使用析构可以一次返回多个值
function test()
{
return [ 'model' => 'someValue' , 'data' => 'someothervalue'];
}

现在你可以用这个

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

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

自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

解构是一个非常强大的工具。它也能够解构key=>值对:

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

看看PHP 7.1的新特性页面:

新特性 .

这是最简单的方法:

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

就是这样。非常容易。

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

<?php


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


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

这段代码实际上是从PHP网站上的以下页面复制的:http://php.net/manual/en/functions.returning-values.php 我自己也使用过相同类型的代码很多次,所以可以确认它是好的,它可以工作

$var1 = 0;
$var2 = 0;


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


// var1 = 1, var2 = 2


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

对于PHP 7.1.0以后,你可以使用新的语法(而不是列表函数):

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


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


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


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

PHP 7.1更新

返回一个数组。

function test($testvar)
{
// Do something
return [$var1, $var2];
}

然后像下面这样使用:

[$value1, $value2] = test($testvar);