Как передать массив в функцию и вернуть результаты с помощью массива

Поэтому я пытаюсь узнать, как передавать массивы через функцию, чтобы я мог обойти невозможность 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]; 

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

Кажется, вы ищете pass-by-reference, чтобы сделать так, чтобы ваша функция выглядела так (обратите внимание на амперсанд):

 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) 

Вы передаете массив в функцию путем копирования. Только объекты передаются по ссылке в 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 

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

Пытаться

 $waffles = foo($waffles); 

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

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

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

или

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

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

Я всегда возвращаю несколько значений, используя комбинацию 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() для получения дополнительной информации.

 function foo(Array $array) { return $array; } 

я знаю, что класс немного переборщик

 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(); 

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

 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 () » ниже .

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

 select login, password, email from members_table where id = $id 

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

 $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); } } } 

Ниже приведен пример вызова функции. Итак, если нам нужно получить данные пользователя для say $ user_id = 12345, из таблицы участников с идентификаторами полей, 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)); 

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

Вы не можете вернуть «несколько значений» в 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];