함수에서 여러 번 반환
다음과 같이 2 개의 리턴을 가진 함수를 가질 수 있습니까?
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
기술적으로는 둘 이상의 값을 반환 할 수 없습니다. 그러나 이러한 제한을 해결하는 방법에는 여러 가지가 있습니다. 여러 값을 반환하는 것과 가장 유사한 방식은 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
연관 배열 과 결합하지 않는 것이 좋습니다 .
귀하의 예에서 두 번째 반환은 발생하지 않습니다-첫 번째 반환은 PHP가 마지막으로 실행하는 것입니다. 여러 값을 반환해야하는 경우 배열을 반환하십시오.
function test($testvar) {
return array($var1, $var2);
}
$result = test($testvar);
echo $result[0]; // $var1
echo $result[1]; // $var2
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];
새로운 기능 페이지를 살펴보십시오 : http://php.net/manual/de/migration71.new-features.php
PHP 5.5에는 새로운 개념이 있습니다 : generators
, 함수에서 여러 값을 얻을 수 있습니다 :
function hasMultipleValues() {
yield "value1";
yield "value2";
}
$values = hasMultipleValues();
foreach ($values as $val) {
// $val will first be "value1" then "value2"
}
또는 참조로 전달할 수 있습니다.
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
나는 꽤 늦었다는 것을 알고 있지만이 문제에 대한 훌륭하고 간단한 해결책이 있습니다.
파괴를 사용하여 한 번에 여러 값을 반환 할 수 있습니다.
function test()
{
return [ 'model' => 'someValue' , 'data' => 'someothervalue'];
}
이제 이것을 사용할 수 있습니다
$result = test();
extract($result);
extract
해당 멤버의 이름을 따서 배열의 각 멤버에 대한 변수를 만듭니다. 당신은 그러므로 지금에 액세스 할 수 있습니다 $model
및$data
함수에서 여러 배열과 스칼라를 반환 할 수 있습니다
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);
리턴 문이 두 개일 수는 없습니다. 그러나 오류가 발생하지 않지만 함수가 호출되면 첫 번째 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);
}
예, 객체를 사용할 수 있습니다 :-)
그러나 가장 간단한 방법은 배열을 반환하는 것입니다.
return array('value1','value2','value3','...');
함수는 정의에 따라 하나의 값만 반환합니다.
그러나 가정 한대로 해당 값은 배열이 될 수 있습니다.
따라서 다음과 같이 확실히 할 수 있습니다.
<?PHP
function myfunc($a,$b){
return array('foo'=>$a,'bar'=>$b);
}
print_r(myfunc('baz','bork'));
즉, 잠시 시간을내어 해결하려는 것이 무엇이든 생각할 가치가 있습니다. 배열이나 객체와 같은 복잡한 결과 값을 반환하는 것은 완벽하게 유효하지만 "두 개의 값을 반환하고 싶다"고 생각하면 제대로 설계되지 않은 것일 수 있습니다. 귀하의 질문에 대한 자세한 설명이 없으면 말하기가 어렵지만 두 번 멈추고 생각하는 것은 결코 아프지 않습니다.
여러 반환 값 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의 함수는 하나의 변수 만 반환 할 수 있습니다. 전역 범위의 변수를 사용하거나 배열을 반환하거나 함수를 참조하고 값을 변경하는 것보다 변수를 전달할 수 있습니다. 그러나이 모든 것이 코드의 가독성을 떨어 뜨립니다. 수업을 살펴 보는 것이 좋습니다.
위에서 몇 가지 답변을 확대하겠다고 생각했습니다 ....
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을 반환합니다. 도움이 되었기를 바랍니다!
일부는 객체로 여러 값을 반환하는 것을 선호 할 수 있습니다.
function test() {
$object = new stdClass();
$object->x = 'value 1';
$object->y = 'value 2';
return $object;
}
그리고 이것을 다음과 같이 부르십시오.
echo test()->x;
또는:
$test = test();
echo $test->y;
위의 녹색 진드기가 주어진 대답은 실제로 잘못되었습니다. 배열을 반환하면 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 또한 같은 종류의 코드를 여러 번 사용 했으므로 확인할 수 있습니다. 그것은 좋고 작동합니다.
배열 일 수있는 하나의 변수 만 항상 반환 할 수 있습니다. 그러나 함수 내부에서 전역 변수를 변경할 수 있습니다. 그것은 대부분 좋은 스타일은 아니지만 작동합니다. 클래스에서는 일반적으로 클래스 변수를 반환하지 않고 함수 내에서 변경합니다.
대답은 '아니오. 파서는 첫 번째 return 문에 도달하면 제어를 호출 함수로 다시 제어합니다. 두 번째 return 문은 절대 실행되지 않습니다.
배열에 모든 변수를 추가하고 마지막으로을 반환합니다 array
.
function test($testvar)
{
// do something
return array("var1" => $var1, "var2" => @var2);
}
그리고
$myTest = test($myTestVar);
//$myTest["var1"] and $myTest["var2"] will be usable
모범 사례는 반환 된 변수를 배열에 넣은 다음 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 />';
?>
나는 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'];
PHP 7.1 <=의 경우 새로운 구문 (목록 함수 대신)을 사용할 수 있습니다.
/**
* @return array [foo, bar]
*/
function getFooAndBar(): array {
return ['foo', 'bar'];
}
[$foo, $bar] = getFooAndBar();
print 'Hello '. $foo .' and '. $bar;
2-3 개의 변수를 반환하려면 괜찮습니다. 그렇지 않으면 원하는 속성을 가진 객체를 사용해야합니다.
다중 리턴을 허용하는 언어는 일반적으로 다중 값을 데이터 구조로 변환합니다.
예를 들어, 파이썬에서는 여러 값을 반환 할 수 있지만 실제로는 1 개의 튜플로 반환됩니다.
따라서 간단한 배열을 만들고 반환하여 PHP에서 여러 값을 반환 할 수 있습니다.
참조로 설정하여 둘 이상의 변수 값을 얻을 수 있습니다.
function t(&$a, &$b) {
$a = 1;
$b = 2;
}
t($a,$b);
echo $a . ' ' . $b;
산출:
1 2
<?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
?>
PHP는 여전히 "out parameters"를 사용합니까? 그렇다면 구문을 사용하여 함수로 들어오는 하나 이상의 매개 변수를 수정할 수 있으며 함수가 반환 된 후 수정 된 변수를 자유롭게 사용할 수 있습니다.
가장 쉬운 방법입니다
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 php7, use array($this->userRole) for php5
$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 cane return only $row['id'] or f_name or .....
//I used the array cause its most using
}
}
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);
그게 다, 매우 불쾌
$var1 = 0;
$var2 = 0;
function test($testvar, &$var1 , &$var2)
{
$var1 = 1;
$var2 = 2;
return;
}
test("", $var1, $var2);
// var1 = 1, var2 = 2
좋은 방법은 아니지만 함수에 2 개의 변수를 동시에 설정할 수 있다고 생각합니다
비슷한 문제가있어서 시도해 보았습니다. (이 스레드 찾기). 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
효과가있다. 나는 얻을 것으로 예상되는 값을 얻었습니다. 이 스레드를 읽는 사람을 도울 수 있기를 바랍니다. :)
참고 URL : https://stackoverflow.com/questions/3451906/multiple-returns-from-function
'Programing' 카테고리의 다른 글
R에서 같은 줄에 문자열 및 변수 내용 인쇄 (0) | 2020.05.22 |
---|---|
라 라벨에서 여러 데이터베이스를 사용하는 방법 (0) | 2020.05.22 |
사전을 목록으로 변환 하시겠습니까? (0) | 2020.05.21 |
당신이 경험 한 최악의 실제 매크로 / 전 처리기 남용은 무엇입니까? (0) | 2020.05.21 |
Premiere Pro의 ExtendScript 연결을 사용하여 가져온 파일을 시퀀스에 추가 (0) | 2020.05.21 |