Beberapa pengembalian dari suatu fungsi

198

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?

vincent
sumber
1
Apa yang sebenarnya ingin Anda capai? Tentunya jika Anda menjelaskan masalah Anda yang sebenarnya, seseorang di sini dapat membantu Anda menemukan solusi yang elegan.
Mike Daniels
3
Pertanyaan tidak membedakan antara salah satu atau satu dari dua nilai, baik dua dari dua nilai, atau evaluasi malas konsep baru satu maka mungkin dua dari dua nilai. Yang pertama sepele dengan segala jenis aliran bersyarat. Yang kedua diizinkan dengan python: q, r = divmod (x, y); serta Lisp; PHP membutuhkan daftar ($ q, $ r) = twovals (); hack, di mana function twovals () {return array ($ a, $ b); }. Evaluasi malas agak maju dan belum tertangkap di PHP. Karena pertanyaannya tidak tepat, sarankan untuk tidak menggunakan entri ini sebagai referensi definitif untuk topik ini.
DragonLord
5
Jika Anda membutuhkan kedua nilai tersebut, kembalikan dalam array.
Bhargav Nanekalva
2
@DragonLord dalam PHP 7.1, Anda dapat menggunakan sintaksis daftar pendek
Janus Troelsen
1
Ada pertanyaan duplikat, tetapi dengan jawaban yang lebih ringkas sehingga akan membuat Anda lebih cepat ke titik: Mengembalikan 2 nilai dari suatu fungsi .
Gras Double

Jawaban:

162

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
galangan kapalZ
sumber
15
Kalau saja PHP punya Perl'swantarray()
Marc B
6
IMHO jawaban ini akan ditingkatkan jika dihilangkan bagian pertama, yang membahas cara mengembalikan satu atau nilai yang berbeda, tergantung pada beberapa kondisi. Saya yakin bahwa 99,999 +% orang yang datang ke diskusi ini ingin tahu cara mengembalikan kedua nilai sekaligus. Lihat jawaban terpilih tertinggi.
ToolmakerSteve
401

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.

Jasper
sumber
2
Juga: kembalikan kompak ('var1', 'var2', 'var3');
bjudson
1
Itu adalah pilihan lain, tetapi bagi saya rasanya tidak mengembalikan banyak nilai, sama seperti mengembalikan array. Itu mungkin hanya aku. Secara pribadi, saya akan menemukan 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.
Jasper
2
Menggunakan List () adalah jawaban yang bagus untuk masalah simular yang saya miliki. ini adalah cara terbaik untuk memvalidasi dan mengembalikan beberapa variabel kembali ke fungsi. cepat melihat php docs akan memberi lebih banyak cahaya pada fungsi ini dan mungkin membuatnya lebih jelas. php.net/manual/en/function.list.php .. terima kasih Jasper!
JustinP
2
+1 untuk jawaban yang begitu luas, terutama untuk pertanyaan umum yang luas. Meskipun begitu, jawaban ini sangat membantu saya.
Lee Blake
2
@Mikey Alasan historis. Jawaban ini awalnya diposting pada pertanyaan yang berbeda, yang dihapus karena duplikat yang persis sama dengan yang satu ini (meskipun faktanya sebenarnya lebih tua). Jawabannya dipindahkan ke pertanyaan ini lebih lambat dari kunjungan terakhir orang yang menanyakan pertanyaan ini.
Jasper
73

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
Air Mancur Tim
sumber
18
Anda juga dapat melakukan:list($result_1, result_2) = test($testvar);
Tim Cooper
@ Tim Cooper: result_2atau $result_2?
Peter Mortensen
@PeterMortensen:$result_2
Tim Cooper
46

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:

Fitur baru

Nukesor
sumber
5
Saya berharap StackOverflow akan memiliki fitur seperti 'fitur jawaban' bahkan ketika tidak diterima pada saat penciptaan pertanyaan karena jawaban ini di sini sangat berguna dan diperbarui, tetapi tentunya di luar topik, tentu saja.
Jonatas CD
3
@ JonatasCD - tidak yakin mengapa Anda mengatakan jawaban ini "di luar topik". Dalam php 7.1 ini adalah cara yang paling nyaman untuk membuat dan menangani beberapa nilai pengembalian dari suatu fungsi. Jadi untuk versi php yang lebih baru, ini merupakan jawaban unggul untuk jawaban yang diterima asli.
ToolmakerSteve
@ToolmakerSteve Saya pikir Anda salah paham. "di luar topik" untuk pertanyaan itu adalah saran saya untuk dapat mengubah apa pertanyaan yang diterima berdasarkan implementasi di masa depan. Itu tidak ada hubungannya dengan jawaban Anda;)
Jonatas CD
@ JonatasCD - Ahh yang menjelaskannya. (Bukan jawaban saya, saya hanya bingung.) Setidaknya sebuah tag yang mengatakan "ini lebih up-to-date daripada jawaban yang diterima" Mungkin tiga orang harus setuju dengan tag itu, dan kemudian menjadi ditampilkan. :)
ToolmakerSteve
26

Di PHP 5.5 ada juga konsep baru:, di generatorsmana Anda dapat menghasilkan beberapa nilai dari suatu fungsi:

function hasMultipleValues() {
    yield "value1";
    yield "value2";
}

$values = hasMultipleValues();
foreach ($values as $val) {
    // $val will first be "value1" then "value2"
}
SztupY
sumber
16

Atau Anda dapat melewati referensi:

function byRef($x, &$a, &$b)
{
    $a = 10 * $x;
    $b = 100 * $x;
}

$a = 0;
$b = 0;

byRef(10, $a, $b);

echo $a . "\n";
echo $b;

Ini akan menghasilkan

100
1000
Jake N
sumber
9

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

Muhammad Raheel
sumber
1
CATATAN: hati-hati bahwa kunci (di sini modeldan data) belum ada sebagai variabel. Jika ya, gunakan prefixparameter extractuntuk menghindari konflik.
ToolmakerSteve
7

Anda dapat mengembalikan banyak array dan skalar dari suatu fungsi

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);
zzapper
sumber
7

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);
}
Apsar
sumber
5

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.

timdev
sumber
5

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 />';

?>
Wael Assaf
sumber
5

Ya, Anda dapat menggunakan objek :-)

Tetapi cara paling sederhana adalah mengembalikan array:

return array('value1', 'value2', 'value3', '...');
Rufinus
sumber
5

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.

Marek Gralikowski
sumber
4

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;
    ?>
Maung Ye Htun Zaw
sumber
4

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.

craig-c
sumber
Jawaban itu merujuk pada contoh kode dalam pertanyaan, sehingga tidak sepenuhnya salah. Tapi pertanyaannya ambigu. Maksud adalah mungkin untuk kembali dua nilai dari satu fungsi panggilan.
Peter Mortensen
3

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.

dobrisa.com
sumber
3

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!

Kyle Coots
sumber
3

Beberapa mungkin lebih suka mengembalikan beberapa nilai sebagai objek:

function test() {
    $object = new stdClass();

    $object->x = 'value 1';
    $object->y = 'value 2';

    return $object;
}

Dan menyebutnya seperti ini:

echo test()->x;

Atau:

$test = test();
echo $test->y;
hovado
sumber
3

Iya dan tidak. Anda tidak bisa mengembalikan lebih dari satu variabel / objek, tetapi seperti yang Anda sarankan, Anda bisa memasukkannya ke dalam array dan mengembalikannya.

Tidak ada batasan untuk bersarang dari array, jadi Anda bisa mengemasnya sedemikian rupa untuk kembali.

Rick
sumber
2

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.

2ndkauboy
sumber
1

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.

eliego
sumber
Sebenarnya, ya. Tapi pertanyaannya ambigu. Mungkin tujuannya adalah untuk mengembalikan dua nilai dari satu panggilan fungsi.
Peter Mortensen
1

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
Ranjan Adhikari
sumber
1

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'];
Gihan De Silva
sumber
Apakah Anda sadar ketika menulis ini? Sekilas saya bisa melihat 2 kesalahan. 1) Anda menggunakan $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'];
dading84
memperbaiki masalah ini.
Gihan De Silva
0
<?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

?>
Liakat
sumber
0

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.

tplaner
sumber
0

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
Jacek Wysocki
sumber
Re "dapatkan nilai dua atau lebih variabel" : Maksud Anda "mengembalikan nilai dua atau lebih variabel" ?
Peter Mortensen
0

Apakah PHP masih menggunakan "parameter keluar"? Jika demikian, Anda dapat menggunakan sintaks untuk memodifikasi satu atau lebih parameter yang masuk ke fungsi Anda. Anda kemudian akan bebas untuk menggunakan variabel yang dimodifikasi setelah fungsi Anda kembali.

Truk35
sumber
-1

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.

Husam
sumber
-1
$var1 = 0;
$var2 = 0;

function test($testvar, &$var1 , &$var2)
{
  $var1 = 1;
  $var2 = 2;
  return;
}
test("", $var1, $var2);

// var1 = 1, var2 = 2 

Ini bukan cara yang baik, tapi saya pikir kita dapat mengatur dua variabel dalam suatu fungsi pada saat yang bersamaan.

khanhkid
sumber
-4

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 :)

Stefan
sumber
3
Ini tidak benar. 'DAN' hanyalah operator boolean, sehingga fungsi Anda sebenarnya mengembalikan nilai boolean tunggal. Satu-satunya alasan tampaknya berfungsi adalah karena Anda mendeklarasikan $ b_id dan $ f_id sebagai variabel global. Hapus 'DAN' serta pernyataan pengembalian sama sekali dan Anda akan melihat bahwa hasil Anda tetap sama.
Matt Styles
ini sangat menyesatkan, karena Anda menyatakan $ b_id, dan $ f_id global, karena itu tersedia dari konteks apa pun.
paulus