2010-09-28 6 views
25

Est-il possible de revenir deux valeurs lorsque vous appelez une fonction qui génèrerait les valeurs, par exemple, je ceci:retour 2 valeurs d'une fonction

<?php 

function ids($uid = 0, $sid = '') 
{ 
    $uid = 1; 
    $sid = md5(time()); 

    return $uid; 
    return $sid;  
} 

echo ids(); 

?> 

qui sortie 1, je veux choisir ce à ouput, par exemple ids($sid), mais il sortira toujours 1.

Est-ce encore possible?

Répondre

55

Vous pouvez uniquement renvoyer une valeur. Mais vous pouvez utiliser un array qui contient lui-même les deux autres valeurs:

return array($uid, $sid); 

Ensuite, vous accédez aux valeurs telles que:

$ids = ids(); 
echo $ids[0]; // uid 
echo $ids[1]; // sid 

Vous pouvez également utiliser un tableau associatif:

return array('uid' => $uid, 'sid' => $sid); 

Et l'accès:

$ids = ids(); 
echo $ids['uid']; 
echo $ids['sid']; 
+2

Cela produirait 'Array' – MacMac

+2

@YouBook: Vous devez changer votre chemin Vous traitez la valeur de retour aussi. – Gumbo

+1

Ah, mon erreur, n'a pas lu vos modifications. Quoi qu'il en soit, bonne réponse. :) * attend jusqu'à ce que je peux l'accepter * – MacMac

6
function ids($uid = 0, $sid = '') 
{ 
    $uid = 1; 
    $sid = md5(time()); 

    return array('uid' => $uid, 
       'sid' => $sid 
       );  
} 

$t = ids(); 
echo $t['uid'],'<br />'; 
echo $t['sid'],'<br />'; 
15

Renvoyer un tableau ou un objet si vous devez renvoyer plusieurs valeurs. Par exemple:

function foo() { 
    return array(3, 'joe'); 
} 

$data = foo(); 
$id = $data[0]; 
$username = $data[1]; 

// or: 
list($id, $username) = foo(); 
+2

+1 pour indiquer des objets comme alternative, en ajoutant une signification sémantique. Cependant, dans des situations critiques, les tableaux peuvent être un peu plus rapides (en cas de doute, benchmark juste pour être sûr). – Archimedix

10

Vous pouvez utiliser un tableau et la fonction de la liste pour obtenir les informations facilement:

function multi($a,$b) { 
    return array($a,$b); 
} 

list($first,$second) = multi(1,2); 

J'espère que cela vous aidera

Jerome

+0

Cela devrait être la réponse acceptée car ici vous retournez plusieurs variables et vous pouvez y accéder directement sans "accéder" au tableau. – Sw0ut

4

De nombreuses possibilités:

// return array 
function f() { 
    return array($uid, $sid); 
} 
list($uid, $sid) = f(); 
$uid; 
$sid; 

// return object 
function f() { 
    $obj = new stdClass; 
    $obj->uid = $uid; 
    $obj->sid = $sid; 
    return $obj; 
} 
$obj->uid; 
$obj->sid; 

// assign by reference 
function f(&$uid, &$sid) { 
    $uid = '...'; 
    $sid = '...'; 
} 
f($uid, $sid); 
$uid; 
$sid; 
+0

Je pense mieux assigner par référence ... mais cela peut être dangereux! –

2
return array('uid' => $uid, 'sid' => $sid); 

puis accéder comme

$dinga = ids(); 
extract($dinga); 

extract fera uid et variable sid. Alors vous pouvez utiliser $ uid et $ sid.

+0

c'est une autre alternative. – user2029015

2

Passer par référence serait une solution. De cette façon vous:

  • retour une valeur selon la procédure habituelle

  • et de modifier la seconde (celle adoptée par refference à la fonction)

Un exemple:

function foo(&$var) // notice the & in front of the parameter passed 
{ 
    $var++; 
    return 1; 
} 

$a=5; 
echo foo($a); 
// echoes 1, the returned value 
echo $a; 
// $a is now 6