是否有更干净的方法来检查数组值以防止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.
您可以创建一个函数:
$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
如果您有一组属性,那么一个简洁的选项是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)));
我至少见过三种方法。
添加具有默认值的数组
$options = $_POST + $defaults;
其中,$options
是一个关联数组,具有$_POST
所具有的所有内容,但添加了$defaults
中的键和值(除非$_POST
中有$defaults
中特定键的值,否则忽略$defaults
中的该特定键/值对,并且不替换$_POST
中该特定键的数值)。
与默认值数组合并
如@mario所示(使用array_merge()
):
$options = array_merge($defaults, $_POST);
正在使用帮助程序函数
例如Kohana的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');
function assure(&$a, $default=null) {
if (!isset($a)) $a=$default;
return $a;
}
$email=assure($_POST['user_email'],'');
$first_name=assure($_POST['user_first_name'],'');
您可以使用来自NSPL:的DefaultArray
$post = defaultarray('', $_POST);
$email = $post['user_email'];
$first_name = $post['user_first_name'];
$last_name = $post['user_last_name'];
$birthday = $post['user_birthday'];