Возврат двух значений из функции

Можно ли вернуть два значения при вызове функции, которая будет выводить значения?

Например, у меня есть это:

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

        return $uid;
        return $sid;
    }

    echo ids();
?>

Что выведет 1. Я хочу выбрать, что выводить, например. ids($sid), но все равно будет выводить 1.

Это вообще возможно?


person MacMac    schedule 28.09.2010    source источник
comment
Эта страница должна быть обновлена ​​для PHP 7.1, деструктурирование (хотя этот вопрос неоднозначен).   -  person Peter Mortensen    schedule 13.12.2019


Ответы (6)


Вы можете вернуть только одно значение. Но вы можете использовать массив, который сам содержит два других значения:

return array($uid, $sid);

Затем вы получаете доступ к таким значениям, как:

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

Вы также можете использовать ассоциативный массив:

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

И доступ к нему:

$ids = ids();
echo $ids['uid'];
echo $ids['sid'];
person Gumbo    schedule 28.09.2010
comment
@YouBook: вам также нужно изменить способ обработки возвращаемого значения. - person Gumbo; 28.09.2010
comment
Ах, моя ошибка, не прочитал ваши правки. В любом случае, отличный ответ. :) ждет, пока я не приму это - person MacMac; 28.09.2010
comment
@YouBook, посмотрите list в моем ответе ниже. Очень удобная функция. - person webbiedave; 28.09.2010

Верните массив или объект, если вам нужно вернуть несколько значений. Например:

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

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

// or:
list($id, $username) = foo();
person Annika Backstrom    schedule 28.09.2010
comment
+1 за намеки на объекты в качестве альтернативы, добавляющие семантическое значение. Однако в критичных по времени ситуациях массивы могут быть немного быстрее (если сомневаетесь, проведите тест, чтобы быть уверенным). - person Arc; 28.09.2010

Вы можете использовать массив и функцию списка, чтобы легко получить информацию:

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

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

Я надеюсь, что это поможет вам

Джером

person Jerome WAGNER    schedule 28.09.2010
comment
Это должен быть принятый ответ, потому что здесь вы возвращаете несколько переменных и можете получить к ним прямой доступ, не обращаясь к массиву. - person Sw0ut; 20.01.2016

Много возможностей:

// 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;
person NikiC    schedule 28.09.2010
comment
Я думаю, лучше назначать по ссылке... но это может быть опасно! - person Felipe Cardoso Martins; 28.09.2010

Передача по ссылке будет решением. Таким образом вы:

  • вернуть значение, как обычно

  • и измените второй (тот, который передается по ссылке на функцию)

Пример:

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
person Adrian Cumpanasu    schedule 14.06.2014

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

а затем получить к нему доступ, как

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

extract сделает uid и sid переменными. Итак, вы можете использовать $uid и $sid.

person user2029015    schedule 12.06.2013
comment
это еще одна альтернатива. - person user2029015; 12.06.2013