是否有可能具有两个返回的函数,如下所示:
function test($testvar)
{
// Do something
return $var1;
return $var2;
}
如果是这样,我如何才能分别获得每份退货?
是否有可能具有两个返回的函数,如下所示:
function test($testvar)
{
// Do something
return $var1;
return $var2;
}
如果是这样,我如何才能分别获得每份退货?
Answers:
无法返回两个变量。虽然,您可以传播一个数组并返回它;创建条件以返回动态变量,等等。
例如,此函数将返回 $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
wantarray()
从技术上讲,您不能返回多个值。但是,有多种方法可以解决该限制。最类似于返回多个值的方式是使用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本身定义的某些函数中(例如,$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;
上面的方法总结了从函数返回多个值的主要方法。但是,这些方法有所不同。要看的最有趣的变体是实际上返回数组的那些变体,仅因为在PHP中可以对数组做很多事情。
首先,我们可以简单地返回一个数组,而不将其视为数组以外的任何东西:
function getXYZ()
{
return array(1,2,3);
}
$array = getXYZ();
$x = $array[1];
$y = $array[2];
$z = $array[3];
关于上面的代码,最有趣的部分是函数中的代码与我提供的第一个示例相同;只有调用该函数的代码已更改。这意味着取决于调用函数如何处理函数返回的结果。
或者,可以使用关联数组:
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'];
应当指出,虽然compact
在extract
可以在调用代码中使用,但是由于使用它是一个坏主意(尤其是对于这样简单的事情),我什至不会给出示例。问题在于它会“神奇”地为您创建变量,而您无需查看代码的其他部分就看不到创建了哪些变量。
最后,我想提一下,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
与关联数组结合使用。
return array('x' => $x, 'y' => $y, 'z' => $z)
更干净的东西,但是到我自己写的时候,而不是我要别人使用这种格式的时候。
在您的示例中,第二个返回将永远不会发生-第一个返回是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);
result_2
还是$result_2
?
$result_2
从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 => value对:
["a" => $a, "b" => $b, "c" => $c] = ["a" => 1, "b" => 2, "c" => 3];
看一下PHP 7.1的新功能页面:
我知道我来晚了,但是有一个很好而简单的解决方案。
可以使用解构一次返回多个值。
function test()
{
return [ 'model' => 'someValue' , 'data' => 'someothervalue'];
}
现在你可以使用这个
$result = test();
extract($result);
extract
为数组中的每个成员创建一个变量,以该成员命名。因此,您现在可以访问$model
和$data
model
和data
)尚未作为变量存在。如果这样,请使用prefix
参数extract
以避免冲突。
它不可能有两个return语句。但是它不会引发错误,但是在调用函数时,您只会收到第一个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);
}
最佳实践是将返回的变量放入数组,然后用于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 7.1 <=,您可以使用新语法(而不是list函数):
/**
* @return array [foo, bar]
*/
function getFooAndBar(): array {
return ['foo', 'bar'];
}
[$foo, $bar] = getFooAndBar();
print 'Hello '. $foo . ' and ' . $bar;
如果您要返回2-3个变量,对我来说就可以了,否则应该使用具有所需属性的对象。
我已经为多个返回值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中返回多个值。有关示例,请参见以下代码:
<?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 我本人也多次使用相同的代码,因此可以确认很好,而且有效。
PHP中的函数只能返回一个变量。您可以使用具有全局作用域的变量,可以返回数组,也可以通过引用该函数来传递变量,而不是更改值,但是所有这些都会降低代码的可读性。我建议您研究一下这些课程。
我以为我会进一步说明上面的一些回答。
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(错误=无错误)。希望这可以帮助!
将所有变量添加到数组中,然后最后返回array
。
function test($testvar)
{
// do something
return array("var1" => $var1, "var2" => @var2);
}
然后
$myTest = test($myTestVar);
//$myTest["var1"] and $myTest["var2"] will be usable
我认为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'];
$this
关键字,但没有提及类或对象。2)如果将值返回到变量中$returned_values
,则应从该变量中回显:echo $returned_values['var1'];
<?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 t(&$a, &$b) {
$a = 1;
$b = 2;
}
t($a, $b);
echo $a . ' ' . $b;
输出:
1 2
这是最简单的方法:
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);
而已。好简单。
我有一个类似的问题-所以我尝试了一下,然后用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
有用。我得到了我期望/应该获得的两个价值。我希望我可以帮助任何人阅读此主题:)