Наименее подробный способ определения значения массива по умолчанию - PullRequest
3 голосов
/ 13 января 2012

Есть ли более чистый способ проверки значений массива для предотвращения уведомлений PHP?В настоящее время я делаю это:

$email      = (isset($_POST['user_email']))      ? $_POST['user_email']      : '';
$first_name = (isset($_POST['user_first_name'])) ? $_POST['user_first_name'] : '';
$last_name  = (isset($_POST['user_last_name']))  ? $_POST['user_last_namel'] : '';
$birthday   = (isset($_POST['user_last_name']))  ? $_POST['user_last_namel'] : '';

Есть ли способ сделать что-то вроде JavaScript, где вы просто предоставляете значение по умолчанию, например, вот так?

user.email = response.email || '';

Я не хочу подавлять уведомления, но эти уродливые проверки загромождают мой код.Я на PHP 5.2.6 .

Ответы [ 5 ]

5 голосов
/ 13 января 2012

Вы можете создать функцию:

$email      = getPost('user_email');
$first_name = getPost('user_first_name');
$last_name  = getPost('user_last_name');
$birthday   = getPost('user_birthday');


function getPost($key, $default = '')
{
    if (isset($_POST[$key])) {
        return $_POST[$key];
    }
    return $default;
}

Поместив ее в функцию, вы также можете упростить дополнительную очистку, например, trim(), если хотите.

Вы также можетепередать значение по умолчанию, которое будет возвращено:

$flavor = getPost('flavor', 'vanilla'); // if $_POST['flavor'] is not set, 'vanilla' is returned
3 голосов
/ 13 января 2012

Если у вас есть набор атрибутов, тогда один краткий вариант - array_merge. Обратите внимание, что значения по умолчанию идут первыми:

 $post = array_merge(
      array("email" => "", "first_name" => "", "last_name" => "", "birthday" => ""),
      $_POST
 );

Тогда просто получите к ним доступ как есть:

 $email = $post["email"];   // it's assured there is some value

Еще более компактный способ локализовать ограниченный набор переменных - extract() в сочетании с array_intersect_key(). Но только в этой комбинации - для предотвращения импорта произвольных переменных:

 extract(array_merge($defaults, array_intersect_key(array_filter($_POST), $defaults)));
2 голосов
/ 13 января 2012

Я видел как минимум три способа сделать это.

Добавление массива со значениями по умолчанию

$options = $_POST + $defaults;

, где $options - это ассоциативный массив, имеющий все, что было $_POST, но с добавленными ключами и значениями из $defaults (если не было значения в $_POST для определенного ключа в $defaults, тогда этот конкретный ключ пара / значение из $defaults игнорируется, и значение для этого конкретного ключа в $_POST не заменяется).

Слияние с массивом значений по умолчанию

Как показано @mario (используйте array_merge()):

$options = array_merge($defaults, $_POST);

Использование вспомогательных функций ...

... например, Arr::get() помощника Коханы :

/* ... */
public static function get($array, $key, $default = NULL)
{
    return isset($array[$key]) ? $array[$key] : $default;
}
/* ... */

, что имеет некоторое преимущество в простой замене значения по умолчанию (которое по умолчанию равно NULL). Можно использовать так:

echo Arr::get($_POST, 'user_email');

или

echo Arr::get($_POST, 'user_email', 'N/A');
0 голосов
/ 24 февраля 2016

Вы можете использовать DefaultArray из NSPL :

$post = defaultarray('', $_POST);

$email = $post['user_email'];
$first_name = $post['user_first_name'];
$last_name = $post['user_last_name'];
$birthday = $post['user_birthday'];
0 голосов
/ 13 января 2012
function assure(&$a, $default=null) {
  if (!isset($a)) $a=$default;
  return $a;
}

$email=assure($_POST['user_email'],'');
$first_name=assure($_POST['user_first_name'],'');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...