다음과 같이 두 개의 리턴을 가진 함수를 가질 수 있습니까?
function test($testvar)
{
// Do something
return $var1;
return $var2;
}
그렇다면 어떻게 각 반품을 개별적으로 얻을 수 있습니까?
다음과 같이 두 개의 리턴을 가진 함수를 가질 수 있습니까?
function test($testvar)
{
// Do something
return $var1;
return $var2;
}
그렇다면 어떻게 각 반품을 개별적으로 얻을 수 있습니까?
답변:
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
둘 다 원한다면 함수를 약간 수정할 수 있습니다.
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
파괴는 매우 강력한 도구입니다. 키 => 값 쌍을 파괴 할 수도 있습니다.
["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 문 값만 수신됩니다. 배열의 반환을 사용하여 여러 값을 얻을 수 있습니다. 예를 들어 :
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);
}
함수는 정의에 따라 하나의 값만 반환합니다.
그러나 가정 한대로 해당 값은 배열이 될 수 있습니다.
따라서 다음과 같이 확실히 할 수 있습니다.
<?PHP
function myfunc($a,$b){
return array('foo'=>$a,'bar'=>$b);
}
print_r(myfunc('baz','bork'));
즉, 잠시 시간을내어 해결하려는 것이 무엇이든 생각할 가치가 있습니다. 배열이나 객체와 같은 복잡한 결과 값을 반환하는 것은 완벽하게 유효하지만 "두 개의 값을 반환하고 싶다"고 생각하면 제대로 설계되지 않은 것일 수 있습니다. 질문에 대한 자세한 설명이 없으면 말하기가 어렵지만 두 번 멈추고 생각하는 것은 결코 아프지 않습니다.
모범 사례는 반환 된 변수를 배열에 넣은 다음 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 I는 또한 확인할 수 있습니다 여러 번 나 자신을 코드의 동일한 종류를 사용했습니다 그것은 좋고 작동합니다.
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>
입력 필드와 제출 단추가 제출되면 이름 입력 필드가 비어 있으면 오류 플래그와 메시지가 리턴됩니다. 이름 필드에 값이 있으면 false = 오류 없음에 대해 값 / 이름과 오류 플래그 0을 반환합니다. 도움이 되었기를 바랍니다!
예, 아니오 변수 / 객체를 두 개 이상 반환 할 수는 없지만 제안한대로 배열에 넣고 반환 할 수 있습니다.
배열의 중첩에는 제한이 없으므로 반환하는 방식으로 배열 할 수 있습니다.
내 대답은 아니오 야. 파서는 첫 번째 return 문에 도달하면 제어를 호출 함수로 다시 지시합니다. 두 번째 return 문은 절대 실행되지 않습니다.
나는 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);
그게 다야. 아주 쉽게.
비슷한 문제가있어서 시도해 보았습니다. (이 스레드 찾기). 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
효과가있다. 나는 얻을 것으로 예상되는 값을 얻었습니다. 이 스레드를 읽는 사람을 도울 수 있기를 바랍니다. :)