定义默认数组值的最简单方法

时间:2012-01-13 18:50:32

标签: php arrays associative-array conventions ternary-operator

是否有更简洁的方法来检查数组值以防止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 个答案:

答案 0 :(得分:5)

您可以创建一个功能:

$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

答案 1 :(得分:3)

如果您有一组属性,那么一个简洁的选项是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 :(得分:2)

我至少看到过三种方法。

添加默认值

的数组
$options = $_POST + $defaults;

其中$options是一个关联数组,其中包含$_POST所有内容,但添加了$defaults的键和值(除非$_POST中有特定键的值$defaults,然后忽略来自$defaults的特定键/值对,并且不替换$_POST中此特定键的值。

与默认数组合并

如@mario所示(使用array_merge()):

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

使用辅助函数......

...例如Kohana的Arr::get() helper

/* ... */
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');

答案 3 :(得分:0)

function assure(&$a, $default=null) {
  if (!isset($a)) $a=$default;
  return $a;
}

$email=assure($_POST['user_email'],'');
$first_name=assure($_POST['user_first_name'],'');

答案 4 :(得分:0)

您可以使用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'];