Apakah mungkin untuk memiliki fungsi dengan dua pengembalian seperti ini:
function test($testvar)
{
// Do something
return $var1;
return $var2;
}
Jika demikian, bagaimana saya bisa mendapatkan masing-masing pengembalian secara terpisah?
Apakah mungkin untuk memiliki fungsi dengan dua pengembalian seperti ini:
function test($testvar)
{
// Do something
return $var1;
return $var2;
}
Jika demikian, bagaimana saya bisa mendapatkan masing-masing pengembalian secara terpisah?
Jawaban:
Tidak ada cara mengembalikan 2 variabel. Meskipun, Anda dapat menyebarkan array dan mengembalikannya; buat persyaratan untuk mengembalikan variabel dinamis, dll.
Misalnya, fungsi ini akan kembali $var2
function wtf($blahblah = true) {
$var1 = "ONe";
$var2 = "tWo";
if($blahblah === true) {
return $var2;
}
return $var1;
}
Dalam aplikasi:
echo wtf();
//would echo: tWo
echo wtf("not true, this is false");
//would echo: ONe
Jika Anda menginginkan keduanya, Anda dapat memodifikasi fungsinya sedikit
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()
Secara teknis, Anda tidak dapat mengembalikan lebih dari satu nilai. Namun, ada beberapa cara untuk mengatasi keterbatasan itu. Cara yang paling bertindak seperti mengembalikan beberapa nilai, adalah dengan listkata kunci:
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)
Secara teknis, Anda mengembalikan array dan menggunakan listuntuk menyimpan elemen-elemen array itu dalam nilai yang berbeda daripada menyimpan array yang sebenarnya. Menggunakan teknik ini akan membuatnya merasa seperti mengembalikan beberapa nilai.
The listsolusi adalah satu agak php-spesifik. Ada beberapa bahasa dengan struktur yang serupa, tetapi lebih banyak bahasa yang tidak. Ada cara lain yang biasanya digunakan untuk "mengembalikan" beberapa nilai dan tersedia dalam hampir setiap bahasa (dengan satu atau lain cara). Namun, metode ini akan terlihat sangat berbeda sehingga mungkin perlu dibiasakan.
// 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);
Teknik ini juga digunakan dalam beberapa fungsi yang didefinisikan oleh php itu sendiri (misalnya $countdalam str_replace , $matchesdalam preg_match ). Ini mungkin terasa sangat berbeda dari mengembalikan beberapa nilai, tetapi layak setidaknya diketahui.
Metode ketiga adalah menggunakan objek untuk menyimpan nilai-nilai berbeda yang Anda butuhkan. Ini lebih banyak mengetik, jadi ini tidak digunakan sesering dua metode di atas. Mungkin masuk akal untuk menggunakan ini, ketika menggunakan serangkaian variabel yang sama di sejumlah tempat (atau tentu saja, bekerja dalam bahasa yang tidak mendukung metode di atas atau memungkinkan Anda melakukan ini tanpa mengetik tambahan).
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;
Metode di atas meringkas cara utama untuk mengembalikan beberapa nilai dari suatu fungsi. Namun, ada variasi pada metode ini. Variasi yang paling menarik untuk dilihat, adalah di mana Anda benar-benar mengembalikan array, hanya karena ada begitu banyak yang dapat Anda lakukan dengan array di PHP.
Pertama, kita bisa mengembalikan array dan tidak memperlakukannya sebagai array selain array:
function getXYZ()
{
return array(1,2,3);
}
$array = getXYZ();
$x = $array[1];
$y = $array[2];
$z = $array[3];
Bagian yang paling menarik tentang kode di atas adalah bahwa kode di dalam fungsinya sama dengan contoh pertama yang saya berikan; hanya kode yang memanggil fungsi yang berubah. Ini berarti terserah orang yang memanggil fungsi bagaimana memperlakukan hasil yang dikembalikan fungsi.
Atau, seseorang dapat menggunakan array asosiatif:
function getXYZ()
{
return array('x' => 4,
'y' => 5,
'z' => 6);
}
$array = getXYZ();
$x = $array['x'];
$y = $array['y'];
$z = $array['z'];
Php memang memiliki compactfungsi yang memungkinkan Anda melakukan hal yang sama seperti di atas tetapi saat menulis kode lebih sedikit. (Yah, sampel tidak akan memiliki kode lebih sedikit, tetapi aplikasi dunia nyata mungkin akan.) Namun, saya pikir jumlah penghematan mengetik minimal dan itu membuat kode lebih sulit dibaca, jadi saya tidak akan melakukannya sendiri. Namun demikian, inilah contohnya:
function getXYZ()
{
$x = 4;
$y = 5;
$z = 6;
return compact('x', 'y', 'z');
}
$array = getXYZ();
$x = $array['x'];
$y = $array['y'];
$z = $array['z'];
Perlu dicatat bahwa walaupun compactmemiliki mitra dalam extractyang dapat digunakan dalam kode panggilan di sini, tetapi karena itu ide yang buruk untuk menggunakannya (terutama untuk sesuatu yang sederhana seperti ini) saya bahkan tidak akan memberikan sampel untuk itu. Masalahnya adalah ia akan melakukan "sihir" dan membuat variabel untuk Anda, sementara Anda tidak dapat melihat variabel mana yang dibuat tanpa pergi ke bagian lain dari kode.
Akhirnya, saya ingin menyebutkan bahwa listtidak benar - benar bermain dengan baik dengan array asosiatif. Berikut ini akan melakukan apa yang Anda harapkan:
function getXYZ()
{
return array('x' => 4,
'y' => 5,
'z' => 6);
}
$array = getXYZ();
list($x, $y, $z) = getXYZ();
Namun, berikut ini akan melakukan sesuatu yang berbeda:
function getXYZ()
{
return array('x' => 4,
'z' => 6,
'y' => 5);
}
$array = getXYZ();
list($x, $y, $z) = getXYZ();
// Pay attention: $y == 6 && $z == 5
Jika Anda menggunakan listarray asosiatif, dan orang lain harus mengubah kode dalam fungsi yang disebut di masa mendatang (yang mungkin terjadi pada situasi apa pun) mungkin tiba-tiba rusak, jadi saya akan merekomendasikan untuk tidak menggabungkan listdengan array asosiatif.
return array('x' => $x, 'y' => $y, 'z' => $z)pembersih, tetapi ke titik di mana saya akan menulis sendiri, bukan ke titik di mana saya akan meminta orang lain untuk menggunakan format itu.
Dalam contoh Anda, pengembalian kedua tidak akan pernah terjadi - pengembalian pertama adalah hal terakhir yang dijalankan PHP. Jika Anda perlu mengembalikan beberapa nilai, kembalikan array:
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_2atau $result_2?
$result_2
Sejak PHP 7.1 kita harus tepat destructuring untuk daftar. Dengan demikian Anda dapat melakukan hal-hal seperti ini:
$test = [1, 2, 3, 4];
[$a, $b, $c, $d] = $test;
echo($a);
> 1
echo($d);
> 4
Dalam fungsi ini akan terlihat seperti ini:
function multiple_return() {
return ['this', 'is', 'a', 'test'];
}
[$first, $second, $third, $fourth] = multiple_return();
echo($first);
> this
echo($fourth);
> test
Destrukturisasi adalah alat yang sangat kuat. Itu mampu merusak kunci => pasangan nilai juga:
["a" => $a, "b" => $b, "c" => $c] = ["a" => 1, "b" => 2, "c" => 3];
Lihatlah halaman fitur baru untuk PHP 7.1:
Saya tahu bahwa saya sangat terlambat, tetapi ada solusi yang bagus dan sederhana untuk masalah ini.
Dimungkinkan untuk mengembalikan beberapa nilai sekaligus menggunakan penghancuran.
function test()
{
return [ 'model' => 'someValue' , 'data' => 'someothervalue'];
}
Sekarang Anda bisa menggunakan ini
$result = test();
extract($result);
extractmembuat variabel untuk setiap anggota dalam array, dinamai setelah anggota itu. Karenanya sekarang Anda dapat mengakses $modeldan$data
modeldan data) belum ada sebagai variabel. Jika ya, gunakan prefixparameter extractuntuk menghindari konflik.
Tidak mungkin memiliki dua pernyataan kembali. Namun itu tidak membuang kesalahan tetapi ketika fungsi dipanggil Anda hanya akan menerima nilai pernyataan pengembalian pertama. Kita dapat menggunakan pengembalian array untuk mendapatkan beberapa nilai sebagai balasannya. Sebagai contoh:
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);
}
Fungsi, menurut definisi, hanya mengembalikan satu nilai.
Namun, seperti yang Anda asumsikan, nilai itu bisa berupa array.
Jadi Anda tentu dapat melakukan sesuatu seperti:
<?PHP
function myfunc($a,$b){
return array('foo'=>$a,'bar'=>$b);
}
print_r(myfunc('baz','bork'));
Yang mengatakan, ada baiknya luangkan waktu sejenak dan pikirkan apa pun yang Anda coba pecahkan. Sementara mengembalikan nilai hasil yang kompleks (seperti array, atau objek) sangat valid, jika Anda berpikir bahwa "Saya ingin mengembalikan dua nilai", Anda mungkin mendesain dengan buruk. Tanpa lebih detail dalam pertanyaan Anda, sulit untuk mengatakannya, tetapi tidak ada salahnya untuk berhenti dan berpikir dua kali.
Praktik terbaik adalah untuk meletakkan variabel Anda kembali ke dalam array dan kemudian gunakan list()untuk menetapkan nilai array ke variabel.
<?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 />';
?>
Untuk PHP 7.1 <= Anda dapat menggunakan sintaks baru (alih-alih fungsi daftar ):
/**
* @return array [foo, bar]
*/
function getFooAndBar(): array {
return ['foo', 'bar'];
}
[$foo, $bar] = getFooAndBar();
print 'Hello '. $foo . ' and ' . $bar;
Tidak masalah bagi saya jika Anda ingin mengembalikan 2-3 variabel, jika tidak, Anda harus menggunakan objek dengan properti yang diinginkan.
Saya telah menerapkan seperti ini untuk beberapa fungsi nilai PHP nilai kembali. bersikap baiklah dengan kode Anda. Terima kasih.
<?php
function multi_retun($aa)
{
return array(1,3,$aa);
}
list($one,$two,$three)=multi_retun(55);
echo $one;
echo $two;
echo $three;
?>
Jawaban yang diberi tanda centang hijau di atas sebenarnya salah. Anda bisa mengembalikan beberapa nilai dalam PHP, jika Anda mengembalikan array. Lihat kode berikut untuk contoh:
<?php
function small_numbers()
{
return array (0, 1, 2);
}
list ($zero, $one, $two) = small_numbers();
Kode ini sebenarnya disalin dari halaman berikut di situs web PHP: http://php.net/manual/en/functions.returning-values.php Saya juga pernah menggunakan jenis kode yang sama berkali-kali, jadi dapat mengkonfirmasi bahwa itu bagus dan berhasil.
Fungsi dalam PHP hanya dapat mengembalikan satu variabel. Anda bisa menggunakan variabel dengan cakupan global, Anda bisa mengembalikan array, atau Anda bisa meneruskan variabel dengan merujuk ke fungsi dan daripada mengubah nilai, .. tetapi semua itu akan mengurangi keterbacaan kode Anda. Saya menyarankan agar Anda melihat ke kelas.
Kupikir aku akan memperluas beberapa tanggapan dari atas ....
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>
Ini akan memberi Anda bidang input dan tombol kirim sekali dikirim, jika bidang input nama kosong itu akan mengembalikan bendera kesalahan dan pesan. Jika bidang nama memiliki nilai maka akan mengembalikan nilai / nama dan bendera kesalahan 0 untuk false = tidak ada kesalahan. Semoga ini membantu!
Anda selalu dapat hanya mengembalikan satu variabel yang mungkin berupa array. Tetapi Anda dapat mengubah variabel global dari dalam fungsi. Itu sebagian besar waktu bukan gaya yang sangat baik, tetapi itu berhasil. Di kelas Anda biasanya mengubah varbiables kelas dari dalam fungsi tanpa mengembalikannya.
Jawabannya adalah tidak. Ketika parser mencapai pernyataan pengembalian pertama, itu akan mengarahkan kontrol kembali ke fungsi panggilan - pernyataan kembali kedua Anda tidak akan pernah dieksekusi.
Tambahkan semua variabel dalam array dan akhirnya kembalikan array.
function test($testvar)
{
// do something
return array("var1" => $var1, "var2" => @var2);
}
Lalu
$myTest = test($myTestVar);
//$myTest["var1"] and $myTest["var2"] will be usable
Saya pikir eliego telah menjelaskan jawabannya dengan jelas. Tetapi jika Anda ingin mengembalikan kedua nilai, masukkan ke dalam array dan kembalikan.
function test($testvar)
{
// do something
return array('var1'=>$var1,'var2'=>$var2);
//defining a key would be better some times
}
// untuk mengakses nilai kembali
$returned_values = test($testvar);
echo $returned_values['var1'];
echo $returned_values['var2'];
$thiskata kunci namun tidak ada kelas atau objek yang disebutkan. 2) Jika Anda mengembalikan nilai ke variabel Anda $returned_values, maka Anda harus menggema dari variabel itu: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
?>
Bahasa yang memungkinkan pengembalian banyak biasanya hanya mengonversi beberapa nilai menjadi struktur data.
Misalnya, dalam Python Anda dapat mengembalikan beberapa nilai. Namun, mereka sebenarnya dikembalikan sebagai satu tuple.
Jadi, Anda dapat mengembalikan beberapa nilai dalam PHP hanya dengan membuat array sederhana dan mengembalikannya.
Anda bisa mendapatkan nilai dua atau lebih variabel dengan menyetelnya dengan referensi:
function t(&$a, &$b) {
$a = 1;
$b = 2;
}
t($a, $b);
echo $a . ' ' . $b;
Keluaran:
1 2
Ini adalah cara termudah untuk melakukannya:
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;
}
}
Bagaimana kita memanggil fungsi ini?
$idData = $selectAllUsers->selectAllUsersByLevel($userRole, 0);
print_r($idData);
$idFName = $selectAllUsers->selectAllUsersByLevel($userRole, 1);
print_r($idFname);
Itu dia. Sangat mudah.
Saya memiliki masalah yang sama - jadi saya mencoba dan sedikit googled (menemukan utas ini). Setelah 5 menit mencoba dan kesalahan saya menemukan bahwa Anda dapat menggunakan "DAN" untuk mengembalikan dua (mungkin lebih - belum diuji) dalam satu baris pengembalian.
Kode saya:
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
berhasil. Saya mendapatkan kedua nilai yang saya harapkan / dapatkan. Saya harap saya bisa membantu siapa saja membaca utas ini :)