Как передать массив в функцию и вернуть результаты с массивом - PullRequest
19 голосов
/ 29 января 2010

Итак, я пытаюсь научиться передавать массивы через функцию, чтобы обойти неспособность PHP вернуть несколько значений. До сих пор не удалось заставить что-либо работать, но вот моя лучшая попытка. Кто-нибудь может указать, где я иду не так?

function foo($array)
{
    $array[3]=$array[0]+$array[1]+$array[2];
    return $array;
}

$waffles[0]=1;
$waffles[1]=2;
$waffles[2]=3;
foo($waffles);

echo $waffles[3];

Для пояснения: я хочу иметь возможность передавать несколько переменных в функцию, что-то делать, а затем возвращать несколько переменных обратно, сохраняя их раздельными. Это был просто пример, который я пытался обойти, чтобы не иметь возможность возвращать несколько переменных из массива

Ответы [ 9 ]

34 голосов
/ 29 января 2010

Похоже, вы ищете передачу по ссылке, чтобы ваша функция выглядела так (обратите внимание на амперсанд):

function foo(&$array)
{
    $array[3]=$array[0]+$array[1]+$array[2];
}

Альтернативно, вы можете присвоить возвращаемое значение функции переменной:

function foo($array)
{
    $array[3]=$array[0]+$array[1]+$array[2];
    return $array;
}

$waffles = foo($waffles)
10 голосов
/ 29 января 2010

Вы передаете массив в функцию путем копирования. Только объекты передаются по ссылке в PHP, а массив не является объектом. Вот что вы делаете (обратите внимание на &)

function foo(&$arr) { # note the &
  $arr[3] = $arr[0]+$arr[1]+$arr[2];
}
$waffles = array(1,2,3);
foo($waffles);
echo $waffles[3]; # prints 6

Помимо этого, я не уверен, почему вы будете выполнять эту конкретную операцию таким образом. Почему бы просто не вернуть сумму вместо присвоения ее новому элементу массива?

4 голосов
/ 17 февраля 2014
function foo(Array $array)
{
     return $array;
}
2 голосов
/ 29 января 2010

Я всегда возвращаю несколько значений, используя комбинацию list() и array() s:

function DecideStuffToReturn() {
    $IsValid = true;
    $AnswerToLife = 42;

    // Build the return array.
    return array($IsValid, $AnswerToLife);
}

// Part out the return array in to multiple variables.
list($IsValid, $AnswerToLife) = DecideStuffToReturn();

Вы можете назвать их как угодно. Я решил оставить переменные функции и возвращаемые переменные одинаковыми для согласованности, но вы можете вызывать их как угодно.

См. list() для получения дополнительной информации.

2 голосов
/ 29 января 2010

Попробуйте

$waffles = foo($waffles);

Или передайте массив по ссылке, как предложено в других ответах.

Кроме того, вы можете добавлять новые элементы в массив без записи индекса, например,

$waffles = array(1,2,3); // filling on initialization

или

$waffles = array();
$waffles[] = 1;
$waffles[] = 2;
$waffles[] = 3;

Если вы хотите суммировать все значения в массиве, используйте array_sum()

1 голос
/ 13 декабря 2018

Другой способ:

$NAME = "John";
$EMAIL = "John@gmail.com";
$USERNAME = "John123";
$PASSWORD = "1234";
$array = Array ("$NAME","$EMAIL","$USERNAME","$PASSWORD");
function getAndReturn (Array $array){
    return $array;
}
print_r(getAndReturn($array));
1 голос
/ 21 мая 2012

Вот как я это делаю. Таким образом, я могу получить функцию для имитации возврата нескольких значений;

function foo($array) 
{ 
    foreach($array as $_key => $_value) 
    {
       $str .= "{$_key}=".$_value.'&';
    }
    return $str = substr($str, 0, -1);
} 

/* Set the variables to pass to function, in an Array */

    $waffles['variable1'] = "value1"; 
    $waffles['variable2'] = "value2"; 
    $waffles['variable3'] = "value3"; 

/* Call Function */

    parse_str( foo( $waffles ));

/* Function returns multiple variable/value pairs */

    echo $variable1 ."<br>";
    echo $variable2 ."<br>";
    echo $variable3 ."<br>";

Особенно полезно, если вы хотите, например, все поля в базе данных должны быть возвращены как переменные, названные так же, как таблица базы данных поля . Смотрите функцию ' db_fields () ' ниже .

Например, если у вас есть запрос

<code>select login, password, email from <code>members_table</code> where id = $id

Функция возвращает несколько переменных:

<code>$login, $password and $email

Вот функция:

function db_fields($field, $filter, $filter_by,  $table = 'members_table') {

 /*
    This function will return as variable names, all fields that you request, 
    and the field values assigned to the variables as variable values.  

    $filter_by = TABLE FIELD TO FILTER RESULTS BY
    $filter =  VALUE TO FILTER BY
    $table = TABLE TO RUN QUERY AGAINST

    Returns single string value or ARRAY, based on whether user requests single
    field or multiple fields.

    We return all fields as variable names. If multiple rows
    are returned, check is_array($return_field); If > 0, it contains multiple rows.
    In that case, simply run parse_str($return_value) for each Array Item. 
*/
    $field = ($field == "*") ? "*,*" : $field;
    $fields = explode(",",$field);

    $assoc_array = ( count($fields) > 0 ) ? 1 : 0;

    if (!$assoc_array) {
        $result = mysql_fetch_assoc(mysql_query("select $field from $table where $filter_by = '$filter'"));
        return ${$field} = $result[$field];
    }
    else
    {
        $query = mysql_query("select $field from $table where $filter_by = '$filter'");
        while ($row = mysql_fetch_assoc($query)) {
            foreach($row as $_key => $_value) {
                $str .= "{$_key}=".$_value.'&';
            }
            return $str = substr($str, 0, -1);
        }
    }
}

Ниже приведен пример вызова функции. Итак, если нам нужно получить данные пользователя, скажем, $ user_id = 12345, из таблицы членов с полями ID, LOGIN, PASSWORD, EMAIL:

$filter = $user_id;
$filter_by = "ID";
$table_name = "members_table"

parse_str(db_fields('LOGIN, PASSWORD, EMAIL', $filter, $filter_by, $table_name));

/* This will return the following variables: */

echo $LOGIN ."<br>";
echo $PASSWORD ."<br>";
echo $EMAIL ."<br>";

Мы также можем позвонить так:

parse_str(db_fields('*', $filter, $filter_by, $table_name));

Вышеуказанный вызов вернет все поля как имена переменных.

1 голос
/ 29 января 2010

Вы не можете вернуть «несколько значений» в PHP. Вы можете вернуть одно значение, которое может быть массивом.

function foo($test1, $test2, $test3)
{
    return array($test1, $test2, $test3);
}
$test1 = "1";
$test2 = "2";
$test3 = "3";

$arr = foo($test1, $test2, $test3);

$test1 = $arr[0];
$test2 = $arr[1];
$test3 = $arr[2];
1 голос
/ 29 января 2010

Я знаю, что класс немного излишним

class Foo
{

 private $sum = NULL;

 public function __construct($array)
 {
   $this->sum[] = $array;
   return $this;
 }

 public function getSum()
 {
   $sum = $this->sum;
   for($i=0;$i<count($sum);$i++)
   {
      // get the last array index
      $res[$i] = $sum[$i] + $sum[count($sum)-$i];
   }
   return $res;
 }


}


$fo = new Foo($myarray)->getSum();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...