2010-09-28 11 views
25

¿Es posible devolver dos valores cuando se llama a una función que tendrían salida de los valores, por ejemplo, tengo esto:Volviendo 2 valores de una función

<?php 

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

    return $uid; 
    return $sid;  
} 

echo ids(); 

?> 

¿Cuál es la salida 1, quiero elegir lo a la salida, por ejemplo ids($sid), pero seguirá generando 1.

¿Es posible?

Respuesta

55

Solo puede devolver un valor. Sin embargo, se puede usar un array que a su vez contiene los otros dos valores:

return array($uid, $sid); 

A continuación, acceder a los valores como:

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

También es posible usar una matriz asociativa:

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

Y accediendo a él:

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

Que daría salida 'Array' – MacMac

+2

@YouBook: Necesita cambiar la forma en que También procesa el valor de retorno. – Gumbo

+1

Ah, mi error, no leí tus ediciones. De todos modos, gran respuesta. :) * espera hasta que pueda aceptar esto * – 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

Devuelve una matriz o un objeto si necesita devolver varios valores. Por ejemplo:

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

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

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

+1 para insinuar objetos como alternativa, agregando significado semántico. Sin embargo, en situaciones de tiempo crítico, las matrices pueden ser un poco más rápidas (en caso de duda, punto de referencia solo para estar seguro). – Archimedix

10

Se puede utilizar una matriz y la función de la lista para obtener la información fácilmente:

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

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

espero que esto le ayudará a

Jerome

+0

Esta debería ser la respuesta aceptada porque aquí devuelve varias variables y puede acceder directamente a ellas sin "acceder" a la matriz. – Sw0ut

4

Muchas posibilidades:

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

Creo que es mejor asignar por referencia ... ¡pero esto puede ser peligroso! –

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

y luego acceder a ella como

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

extract hará UID y variables sid. Entonces puedes usar $ uid y $ sid.

+0

esta es otra alternativa. – user2029015

2

Pase por referencia sería una solución. esta manera:

  • retorno un valor como lo haría normalmente

  • y modificar la segunda (la aprobada por refference a la función)

Un ejemplo:

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 
Cuestiones relacionadas