PHPeoples,我已经厌倦了这样做
$value = isset($arr[$key]) ? $arr[$key] : null;
或
$value = array_key_exists($key, $arr) ? $arr[$key] : null;
没有人告诉我要做什么
$arr = array(1);
$key = 5;
$value = $arr[$key];
// Notice: Undefined offset: 5
我得了支气管炎。没人有时间玩这个。
I could make a function, I guess…
function array_get(Array $arr, $key, $default=null) {
return array_key_exists($key, $arr)
? $arr[$key]
: $default
;
}
但这是最好的(最习惯的)方式吗?
更优雅的做法:
function ifsetor(&$value, $default = null) {
return isset($value) ? $value : $default;
}
现在你可以这样做:
$value = ifsetor($arr[$key]);
$message = ifsetor($_POST['message'], 'No message posted');
等。这里$value
是通过引用传递的,所以它不会抛出Notice。
进一步阅读:
- NikiC的博客-反对ifsetor函数的案例 PHP RFC - https://wiki.php.net/rfc/ifsetor
如果您需要确保某些键存在,那么您可以创建一个默认数组并在您的输入(或其他)中合并。这样,所有必要的键都将存在,如果可能的话,它们将被更新:
$defaults = array(
'foo' => '',
'bar' => ''
);
$data = array_merge($defaults, $someOtherArray);
Docs for array_merge()
: http://php.net/array_merge
当考虑到HTML表单上的复选框可能会或可能不会在$_GET
或$_POST
中显示时,我发现这很有帮助。
注意这个过程需要字符串数组键,而不是数字键。
不要忘记函数isset()对于与NULL值对应的数组键不返回TRUE,而array_key_exists()返回TRUE。因此,上述所有答案都不能正确处理数组中NULL元素。对于这种情况,您可以查看我的编辑答案。例如我们有一个数组:
$test = array(NULL,'',0,false,'0');
如果我们使用(来自本主题的答案)函数:
function ifsetor(&$value, $default = null) {
return isset($value) ? $value : $default;
}
并尝试获取数组数据:
echo '---------------------';
var_dump($test);
echo 'Array count : '.count($test).'<br>';
echo '---------------------';
var_dump(ifsetor($test[0], 'Key not exists'));
var_dump(ifsetor($test[1],'Key not exists'));
var_dump(ifsetor($test[2],'Key not exists'));
var_dump(ifsetor($test[3], 'Key not exists'));
var_dump(ifsetor($test[4],'Key not exists'));
var_dump(ifsetor($test1[5],'Key not exists'));
function ifsetor(&$value, $default = null) {
return isset($value) ? $value : $default;
}
我们的结果是:
---------------------
array (size=5)
0 => null
1 => string '' (length=0)
2 => int 0
3 => boolean false
4 => string '0' (length=1)
Array count : 5
---------------------
string 'Key not exists' (length=9) //But value in this key of array - NULL! and key exists
string '' (length=0)
int 0
boolean false
string '0' (length=1)
string 'Key not exists' (length=9)
所以我们可以使用isset和array_key_exists来检查它。别忘了检查这是不是数组;
echo '---------------------';
var_dump($test);
echo 'Array count : '.count($test).'<br>';
echo '---------------------';
var_dump(array_get($test, 0, 'Key not exists'));
var_dump(array_get($test, 1,'Key not exists'));
var_dump(array_get($test, 2,'Key not exists'));
var_dump(array_get($test, 3, 'Key not exists'));
var_dump(array_get($test, 4,'Key not exists'));
var_dump(array_get($test, 5,'Key not exists')); //Key not exists
var_dump(array_get($test1, 5,'Key not exists')); //This is not array
function array_get($arr, $key, $default=null) {
if(is_array($arr)){
return isset($arr[$key]) || array_key_exists($key, $arr)
? $arr[$key]
: $default;
}else{
return 'No array given';
}
}
现在答案是正确的:
---------------------
array (size=5)
0 => null
1 => string '' (length=0)
2 => int 0
3 => boolean false
4 => string '0' (length=1)
Array count : 5
---------------------
null //Perfect - key exists!
string '' (length=0)
int 0
boolean false
string '0' (length=1)
string 'No array given' (length=14)
string 'Key not exists' (length=14)
这已经是一个内置函数,如果使用$_GET
, $_POST
, $_COOKIE
, $_SERVER
, $_ENV
,您可以使用:
$value = filter_input(INPUT_GET, $key);
加上它做更多。如果您还想在同一赋值中验证或清理过滤器,可选过滤器会很方便。
返回-成功时请求变量的值,如果过滤器失败则返回FALSE;如果没有设置变量variable_name,则为NULL。如果旗帜使用FILTER_NULL_ON_FAILURE,如果变量为,则返回FALSE如果过滤器失败,则为NULL。