Có thể có một hàm với hai trả về như thế này:
function test($testvar)
{
// Do something
return $var1;
return $var2;
}
Nếu vậy, làm thế nào tôi có thể nhận được mỗi lần trả lại một cách riêng biệt?
Có thể có một hàm với hai trả về như thế này:
function test($testvar)
{
// Do something
return $var1;
return $var2;
}
Nếu vậy, làm thế nào tôi có thể nhận được mỗi lần trả lại một cách riêng biệt?
Câu trả lời:
Không có cách nào trả về 2 biến. Mặc dù, bạn có thể truyền một mảng và trả về nó; tạo một điều kiện để trả về một biến động, v.v.
Chẳng hạn, hàm này sẽ trả về $var2
function wtf($blahblah = true) {
$var1 = "ONe";
$var2 = "tWo";
if($blahblah === true) {
return $var2;
}
return $var1;
}
Trong ứng dụng:
echo wtf();
//would echo: tWo
echo wtf("not true, this is false");
//would echo: ONe
Nếu bạn muốn cả hai, bạn có thể sửa đổi chức năng một chút
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()
Về mặt kỹ thuật, bạn không thể trả lại nhiều hơn một giá trị. Tuy nhiên, có nhiều cách để khắc phục hạn chế đó. Cách hoạt động giống như trả về nhiều giá trị, là với list
từ khóa:
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)
Về mặt kỹ thuật, bạn đang trả về một mảng và sử dụng list
để lưu trữ các phần tử của mảng đó trong các giá trị khác nhau thay vì lưu trữ mảng thực tế. Sử dụng kỹ thuật này sẽ làm cho nó cảm thấy giống như trả lại nhiều giá trị.
Các list
giải pháp là một trong những thay php cụ thể. Có một vài ngôn ngữ có cấu trúc tương tự, nhưng nhiều ngôn ngữ thì không. Có một cách khác thường được sử dụng để "trả lại" nhiều giá trị và nó có sẵn ở mọi ngôn ngữ (bằng cách này hay cách khác). Tuy nhiên, phương pháp này sẽ trông khá khác nhau nên có thể cần một số làm quen.
// 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);
Kỹ thuật này cũng được sử dụng trong một số chức năng được xác định bởi chính php (ví dụ: $count
trong str numplace , $matches
trong preg_match ). Điều này có thể cảm thấy khá khác với việc trả lại nhiều giá trị, nhưng ít nhất nó cũng đáng để biết.
Phương pháp thứ ba là sử dụng một đối tượng để giữ các giá trị khác nhau mà bạn cần. Đây là cách gõ nhiều hơn, vì vậy nó không được sử dụng thường xuyên như hai phương pháp trên. Tuy nhiên, có thể có ý nghĩa khi sử dụng điều này khi sử dụng cùng một bộ biến ở một số nơi (hoặc tất nhiên, làm việc trong một ngôn ngữ không hỗ trợ các phương pháp trên hoặc cho phép bạn thực hiện việc này mà không cần nhập thêm).
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;
Các phương thức trên tổng hợp các cách chính để trả về nhiều giá trị từ một hàm. Tuy nhiên, có những biến thể về các phương pháp này. Các biến thể thú vị nhất để xem xét, là những biến thể mà bạn thực sự trả về một mảng, đơn giản là vì có rất nhiều thứ bạn có thể làm với các mảng trong PHP.
Đầu tiên, chúng ta chỉ có thể trả về một mảng và không coi nó là bất cứ thứ gì ngoại trừ một mảng:
function getXYZ()
{
return array(1,2,3);
}
$array = getXYZ();
$x = $array[1];
$y = $array[2];
$z = $array[3];
Phần thú vị nhất về mã ở trên là mã bên trong hàm giống như trong ví dụ đầu tiên tôi cung cấp; chỉ có mã gọi hàm thay đổi. Điều này có nghĩa là tùy thuộc vào cách gọi hàm làm thế nào để xử lý kết quả mà hàm trả về.
Ngoài ra, người ta có thể sử dụng một mảng kết hợp:
function getXYZ()
{
return array('x' => 4,
'y' => 5,
'z' => 6);
}
$array = getXYZ();
$x = $array['x'];
$y = $array['y'];
$z = $array['z'];
Php có compact
chức năng cho phép bạn làm tương tự như trên nhưng trong khi viết ít mã hơn. (Chà, mẫu sẽ không có ít mã hơn, nhưng một ứng dụng trong thế giới thực có thể sẽ có.) Tuy nhiên, tôi nghĩ rằng mức độ tiết kiệm gõ là tối thiểu và nó làm cho mã khó đọc hơn, vì vậy tôi sẽ không tự làm điều đó. Tuy nhiên, đây là một mẫu:
function getXYZ()
{
$x = 4;
$y = 5;
$z = 6;
return compact('x', 'y', 'z');
}
$array = getXYZ();
$x = $array['x'];
$y = $array['y'];
$z = $array['z'];
Cần lưu ý rằng trong khi compact
có một đối tác trongextract
có thể được sử dụng trong mã gọi ở đây, nhưng vì đó là một ý tưởng tồi để sử dụng nó (đặc biệt đối với một cái gì đó đơn giản như thế này) tôi thậm chí sẽ không đưa ra một mẫu cho nó. Vấn đề là nó sẽ thực hiện "phép thuật" và tạo các biến cho bạn, trong khi bạn không thể thấy biến nào được tạo mà không đi đến các phần khác của mã.
Cuối cùng, tôi muốn đề cập rằng list
không thực sự chơi tốt với mảng kết hợp. Sau đây sẽ làm những gì bạn mong đợi:
function getXYZ()
{
return array('x' => 4,
'y' => 5,
'z' => 6);
}
$array = getXYZ();
list($x, $y, $z) = getXYZ();
Tuy nhiên, sau đây sẽ làm một cái gì đó khác nhau:
function getXYZ()
{
return array('x' => 4,
'z' => 6,
'y' => 5);
}
$array = getXYZ();
list($x, $y, $z) = getXYZ();
// Pay attention: $y == 6 && $z == 5
Nếu bạn đã sử dụng list
với một mảng kết hợp và người khác phải thay đổi mã trong hàm được gọi trong tương lai (điều này có thể xảy ra với bất kỳ tình huống nào) thì nó có thể đột ngột bị hỏng, vì vậy tôi khuyên bạn không nên kết hợp list
với mảng kết hợp.
return array('x' => $x, 'y' => $y, 'z' => $z)
sạch hơn, nhưng đến mức tôi sẽ tự viết nó, không đến mức tôi sẽ yêu cầu người khác sử dụng định dạng đó.
Trong ví dụ của bạn, lần trả lại thứ hai sẽ không bao giờ xảy ra - lần trả lại đầu tiên là điều cuối cùng PHP sẽ chạy. Nếu bạn cần trả về nhiều giá trị, trả về một mảng:
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
hay $result_2
?
$result_2
Kể từ PHP 7.1, chúng tôi có sự phá hủy thích hợp cho các danh sách. Qua đó bạn có thể làm những việc như thế này:
$test = [1, 2, 3, 4];
[$a, $b, $c, $d] = $test;
echo($a);
> 1
echo($d);
> 4
Trong một chức năng, nó sẽ trông như thế này:
function multiple_return() {
return ['this', 'is', 'a', 'test'];
}
[$first, $second, $third, $fourth] = multiple_return();
echo($first);
> this
echo($fourth);
> test
Phá hủy là một công cụ rất mạnh mẽ. Nó cũng có khả năng phá hủy khóa => cặp giá trị:
["a" => $a, "b" => $b, "c" => $c] = ["a" => 1, "b" => 2, "c" => 3];
Hãy xem trang tính năng mới cho PHP 7.1:
Tôi biết rằng tôi khá muộn, nhưng có một giải pháp tốt và đơn giản cho vấn đề này.
Có thể trả về nhiều giá trị cùng một lúc bằng cách sử dụng hàm hủy.
function test()
{
return [ 'model' => 'someValue' , 'data' => 'someothervalue'];
}
Bây giờ bạn có thể sử dụng này
$result = test();
extract($result);
extract
tạo một biến cho mỗi thành viên trong mảng, được đặt tên theo thành viên đó. Do đó bạn có thể truy cập $model
và$data
model
và data
) không tồn tại dưới dạng các biến. Nếu họ làm, sử dụng prefix
tham số của extract
để tránh xung đột.
Nó không thể có hai tuyên bố trở lại. Tuy nhiên, nó không ném lỗi nhưng khi hàm được gọi, bạn sẽ chỉ nhận được giá trị câu lệnh trả về đầu tiên. Chúng ta có thể sử dụng trả về mảng để nhận lại nhiều giá trị. Ví dụ:
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);
}
Hàm, theo định nghĩa, chỉ trả về một giá trị.
Tuy nhiên, như bạn đã giả định, giá trị đó có thể là một mảng.
Vì vậy, bạn chắc chắn có thể làm một cái gì đó như:
<?PHP
function myfunc($a,$b){
return array('foo'=>$a,'bar'=>$b);
}
print_r(myfunc('baz','bork'));
Điều đó nói rằng, đáng để dành một chút thời gian và suy nghĩ về bất cứ điều gì bạn đang cố gắng giải quyết. Mặc dù trả về một giá trị kết quả phức tạp (như một mảng hoặc một đối tượng) là hoàn toàn hợp lệ, nếu bạn nghĩ rằng "Tôi muốn trả về hai giá trị", bạn có thể đang thiết kế kém. Không có nhiều chi tiết hơn trong câu hỏi của bạn, thật khó để nói, nhưng không bao giờ đau lòng để dừng lại và suy nghĩ hai lần.
Thực hành tốt nhất là đặt các biến trả về của bạn thành mảng và sau đó sử dụng list()
để gán giá trị mảng cho các biến.
<?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 />';
?>
Đối với PHP 7.1 <= bạn có thể sử dụng cú pháp mới (thay vì hàm danh sách ):
/**
* @return array [foo, bar]
*/
function getFooAndBar(): array {
return ['foo', 'bar'];
}
[$foo, $bar] = getFooAndBar();
print 'Hello '. $foo . ' and ' . $bar;
Tôi đồng ý với tôi nếu bạn muốn trả về 2-3 biến, nếu không, bạn nên sử dụng một đối tượng có các thuộc tính mong muốn.
Tôi đã thực hiện như thế này cho nhiều hàm PHP giá trị trả về. tốt đẹp với mã của bạn. cảm ơn bạn.
<?php
function multi_retun($aa)
{
return array(1,3,$aa);
}
list($one,$two,$three)=multi_retun(55);
echo $one;
echo $two;
echo $three;
?>
Câu trả lời được đánh dấu màu xanh lá cây ở trên thực sự không chính xác. Bạn có thể trả về nhiều giá trị trong PHP, nếu bạn trả về một mảng. Xem mã sau đây cho một ví dụ:
<?php
function small_numbers()
{
return array (0, 1, 2);
}
list ($zero, $one, $two) = small_numbers();
Mã này thực sự được sao chép từ trang sau trên trang web của PHP: http://php.net/manual/en/fifts.retinating-values.php Tôi cũng đã sử dụng cùng một loại mã nhiều lần, vì vậy có thể xác nhận rằng nó tốt và nó hoạt động.
Các hàm trong PHP chỉ có thể trả về một biến. bạn có thể sử dụng các biến có phạm vi toàn cục, bạn có thể trả về mảng hoặc bạn có thể chuyển biến bằng cách tham chiếu đến hàm và thay đổi giá trị, .. nhưng tất cả điều đó sẽ làm giảm khả năng đọc mã của bạn. Tôi muốn đề nghị bạn nhìn vào các lớp học.
Nghĩ rằng tôi sẽ mở rộng một vài câu trả lời từ phía trên ....
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>
Điều này sẽ cung cấp cho bạn một trường đầu vào và một nút gửi sau khi gửi, nếu trường nhập tên trống, nó sẽ trả về cờ lỗi và thông báo. Nếu trường tên có giá trị, nó sẽ trả về giá trị / tên và cờ lỗi là 0 cho false = không có lỗi. Hi vọng điêu nay co ich!
Bạn luôn có thể chỉ trả về một biến có thể là một mảng. Nhưng bạn có thể thay đổi các biến toàn cục từ bên trong hàm. Đó là hầu hết thời gian không phải là phong cách rất tốt, nhưng nó hoạt động. Trong các lớp, bạn thường thay đổi các biến thể lớp từ bên trong các hàm mà không trả lại chúng.
Câu trả lời là không. Khi trình phân tích cú pháp đạt đến câu lệnh return đầu tiên, nó sẽ điều khiển trực tiếp trở lại chức năng gọi - câu lệnh return thứ hai của bạn sẽ không bao giờ được thực thi.
Thêm tất cả các biến trong một mảng và cuối cùng trả về array
.
function test($testvar)
{
// do something
return array("var1" => $var1, "var2" => @var2);
}
Và sau đó
$myTest = test($myTestVar);
//$myTest["var1"] and $myTest["var2"] will be usable
Tôi nghĩ rằng eliego đã giải thích câu trả lời rõ ràng. Nhưng nếu bạn muốn trả về cả hai giá trị, hãy đặt chúng vào một mảng và trả về nó.
function test($testvar)
{
// do something
return array('var1'=>$var1,'var2'=>$var2);
//defining a key would be better some times
}
// để truy cập các giá trị trả về
$returned_values = test($testvar);
echo $returned_values['var1'];
echo $returned_values['var2'];
$this
từ khóa nhưng không có lớp hoặc đối tượng được đề cập. 2) Nếu bạn trả lại các giá trị vào biến của mình $returned_values
, thì bạn nên lặp lại từ biến đó: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
?>
Các ngôn ngữ cho phép trả về nhiều thường chỉ chuyển đổi nhiều giá trị thành cấu trúc dữ liệu.
Ví dụ: trong Python bạn có thể trả về nhiều giá trị. Tuy nhiên, chúng thực sự chỉ được trả lại như một tuple.
Vì vậy, bạn có thể trả về nhiều giá trị trong PHP bằng cách chỉ cần tạo một mảng đơn giản và trả về đó.
Bạn có thể nhận các giá trị của hai hoặc nhiều biến bằng cách đặt chúng theo tham chiếu:
function t(&$a, &$b) {
$a = 1;
$b = 2;
}
t($a, $b);
echo $a . ' ' . $b;
Đầu ra:
1 2
Đây là cách dễ nhất để làm điều đó:
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;
}
}
Làm thế nào chúng ta có thể gọi chức năng này?
$idData = $selectAllUsers->selectAllUsersByLevel($userRole, 0);
print_r($idData);
$idFName = $selectAllUsers->selectAllUsersByLevel($userRole, 1);
print_r($idFname);
Đó là nó. Rất dễ.
Tôi đã có một vấn đề tương tự - vì vậy tôi đã thử xung quanh và googled một chút (tìm chủ đề này). Sau 5 phút thử và lỗi tôi phát hiện ra rằng bạn chỉ cần sử dụng "VÀ" để trả về hai (có thể nhiều hơn - chưa được kiểm tra) trong một dòng trả về.
Mã của tôi:
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
nó hoạt động Tôi đã nhận được cả hai giá trị mà tôi mong đợi nhận được / nên nhận được. Tôi hy vọng tôi có thể giúp bất cứ ai đọc chủ đề này :)