#php #arrays
#php #массивы
Вопрос:
Я хочу передать функции один аргумент, а не несколько аргументов, которые имеют тенденцию неожиданно увеличиваться. Итак, я полагаю, что массив выполнит свою работу. Вот что я набросал на данный момент…
<?php
function fun_stuff($var){
// I want to parse the array in the function, and use
}
$my = array();
$my['recordID'] = 5;
$my['name'] = 'John Smith';
$my['email'] = 'john@someemail.com';
echo fun_stuff($my);
?>
Я не совсем понял концепцию синтаксического анализа массива. И это хороший способ для меня научиться. Обычно я передаю одни и те же переменные, но иногда в записи нет адреса электронной почты, поэтому мне нужно создать условие для отсутствующих ключей.
Правильно ли я пока все делаю? Могу ли я передать массив в качестве аргумента функции? И если да, то как мне проанализировать и выполнить поиск существующих ключей?
Комментарии:
1. Прежде всего, прочитайте страницу руководства !
Ответ №1:
Надеюсь, это не слишком далеко от темы … но вы звучали так, как будто просто пытались избежать нескольких параметров, когда некоторые из них могут быть нулевыми. Итак, я бы рекомендовал вам использовать объект вместо массива для наглядности…таким образом, не возникает путаницы относительно того, какие свойства должны существовать. Если вы используете PHP 5, вы также можете строго ввести параметр, чтобы ничто другое не могло попасть внутрь. Итак:
class Record {
public $Id;
public $Name;
public $Email
}
function fun_stuff( Record $record ) {
// you will now have better intellisense if you use an IDE
// and other develoers will be able to see intended parameters
// clearly, while an array would require them to know what's
// intended to be there.
if( !empty($record->Email) ) {
// do whatever.
}
}
Ответ №2:
Да, вы на правильном пути. Подход, который я использую, заключается в том, что в качестве первых параметров ставятся обязательные параметры, а все необязательные параметры — в последнем аргументе, который является массивом.
Например:
function fun_stuff($required1, $required2, $var = array()) {
// parse optional arguments
$recordId = (key_exists('recordID', $var) ? $var['recordId'] : 'default value');
$name = (key_exists('name', $var) ? $var['name'] : 'default value');
$email = (key_exists('email', $var) ? $var['email'] : 'default value');
}
Затем вы можете вызвать свою функцию следующим образом:
fun_stuff('val 1', 'val 2', array(
'recordId' => 1,
'name' => 'John',
'email' => 'john@stackoverflow.com'
));
Комментарии:
1. также вам нужно убедиться, что вы хорошо документируете необязательные аргументы ваших функций, поскольку становится трудно понять, какие аргументы могут быть переданы функции… представьте, что если бы вы не писали код, вы были бы в состоянии понять, что делает функция, без необходимости читать ее полное тело.
Ответ №3:
Это плохая практика проектирования, но здесь вопрос не в этом. Вы можете «разобрать» массив примерно так…
if( array_key_exists( 'email', $var ))
{
// use email field
}
Если вам нужно, вы можете перебирать все элементы вот так…
foreach( $var as $key => $value )
{
echo '$var[''.$key.''] = '.$value;
}
Ответ №4:
Я не рекомендую вам использовать array для этого.
Вы можете определить необязательные аргументы со значениями по умолчанию:
//$name and $email are optional here
function fun($record_id, $name='', $email='')
{
if (empty($name)) print '$name is empty';
}
//Usage:
fun(5, 'Robert');
fun(5);
fun(5, 'Robert', 'robert@gmail');
fun(3,'','robert@gmail');
Если вы будете использовать array, IDE не сможет показывать предложения по автозаполнению, это означает больше опечаток, и вам придется запоминать все ключи этого массива вечно или каждый раз просматривать код функции.
Комментарии:
1. 1 — если в вашем списке параметров меньше 5 или 6 параметров, то этот маршрут подходит. В противном случае я бы пошел по пути, который я предложил, используя объект.
Ответ №5:
Я не совсем уверен, чего вы хотите достичь, но я подозреваю что-то вроде этого:
$aPersons = array();
$aPersons[] = array('name' => 'name1', 'age' => 1);
$aPersons[] = array('name' => 'name2', 'age' => 2);
array_map('parsePerson', $aPersons);
function parsePerson($aPerson) {
echo $aPerson['name'];
echo $aPerson['age'];
}
Проблема с вашим текущим массивом заключается в том, что он имеет только одно измерение.
Вы можете просто сделать echo $my['name'];
. Однако есть более простые способы разбора массивов.
foreach($aPersons as $aPerson) {
echo $aPerson['name'];
echo $aPerson['age'];
}
$iLength = sizeof($aPersons);
for($i = 0; $i <= $iLength; $i ) {
echo $aPersons[$i]['name'];
echo $aPersons[$i]['age'];
}
Ответ №6:
Для синтаксического анализа и просмотра существует функция signficant print_r
, которая выдает подробные сведения о массиве.
При вызове функции вам нужен return
синтаксис в конце, который будет анализировать все, что вы вызываете в возврате.
Ответ №7:
Очевидно, что вы можете передать массив в функцию. Внутри него считывается переменная так, как вы присваивали значения перед ней. Если вы назначаете:
$my['key'] = 'value';
В вашей функции используется:
echo $var['key'];
Ответ №8:
Почему вы не используете foreach
для обхода массива?
function fun_stuff($var){
foreach($var as $key => $item){
echo '[', $key, "] => ", $item, "n";
}
}
$my = array();
$my['recordID'] = 5;
$my['name'] = 'John Smith';
$my['email'] = 'john@someemail.com';
fun_stuff($my);
Ответ №9:
Да, это правильно (хотя ваш вопрос немного широковат). Вы уже ссылаетесь на значения массива через индексы при настройке $my
переменной. Вы можете сделать то же самое внутри вашей функции (с $var
переменной).
Я рекомендую взглянуть на все встроенные в PHP функции массива: http://php.net/manual/en/ref.array.php
Ответ №10:
Попробуйте это:
function fun_stuff($var){
// I want to parse the array in the function, and use
$fun_string = "";
if( is_array( $var ) {
if( array_key_exists( "name", $var ) )
$fun_string .= "For " . $var["name"];
else $fun_string .= "A nameless one ";
if( array_key_exists( "email", $var ) )
$fun_string .= " (email: " . $var["email"] . ")";
else $fun_string .= " without a known e-mail address";
if( array_key_exists( "recordID", $var ) )
$fun_string .= " has record ID of " . $var["recordID"];
else $fun_string .= " has no record ID set";
$fun_string .= "n";
}
return $fun_string;
}
Ответ №11:
Да, вы можете! Просто передайте массив, а внутри функции просто используйте цикл foreach для его синтаксического анализа!
function myFunction($array)
{
foreach($array as $value)
{
echo $value;
}
}
или, если вы хотите иметь полный контроль над парой ключ / значение:
function myFunction($array)
{
foreach($array as $key=>$value)
{
echo "key:".$array[$key]."value:".$values;
}
}