Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中,有没有一种惯用方法可以从数组中获取潜在的未定义键?_Php_Arrays_Idioms - Fatal编程技术网

在PHP中,有没有一种惯用方法可以从数组中获取潜在的未定义键?

在PHP中,有没有一种惯用方法可以从数组中获取潜在的未定义键?,php,arrays,idioms,Php,Arrays,Idioms,朋友们,我已经厌倦了这样做 $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 我得了支气管炎。没有人有时间 我想我可以做一个函数 fun

朋友们,我已经厌倦了这样做

$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
我得了支气管炎。没有人有时间


我想我可以做一个函数

function array_get(Array $arr, $key, $default=null) {
  return array_key_exists($key, $arr)
    ? $arr[$key]
    : $default
  ;
}

但是这是最好的(最惯用的)方法吗?

如果您需要确保某些键存在,那么您可以创建一个默认数组并合并到您的输入(或任何内容)中。这样,所有必要的密钥都将存在,并在可能的情况下进行更新:

$defaults = array(
    'foo' => '',
    'bar' => ''
);

$data = array_merge($defaults, $someOtherArray);
用于
数组的文档\u merge()

当考虑HTML表单上的复选框时,我发现这很有帮助,这些复选框可能会出现在
$\u GET
$\u POST
中,也可能不会出现


请注意,此进程需要字符串数组键,而不是数字键。有关说明,请参阅文档。

更优雅的方式:

function ifsetor(&$value, $default = null) {
    return isset($value) ? $value : $default;
}
现在,您只需执行以下操作:

$value   = ifsetor($arr[$key]);
$message = ifsetor($_POST['message'], 'No message posted');
在这里,
$value
是通过引用传递的,所以它不会抛出通知

进一步阅读:

  • PHP RFC-

如果使用
$\u GET
$\u POST
$\u COOKIE
$\u SERVER
$\u ENV
,它已经是一个内置函数,您可以使用:

$value = filter_input(INPUT_GET, $key);
而且它做的更多。如果您还希望在同一分配中验证或清理筛选器,则可选筛选器将非常方便

返回-成功时请求变量的值,如果筛选器失败,则返回FALSE, 如果未设置变量名称变量,则为NULL。如果国旗 如果使用FILTER\u NULL\u ON\u FAILURE,则如果变量为 如果筛选器失败,则不设置为空


不要忘记函数isset()对于对应于NULL值的数组键不会返回TRUE,而array\u key\u 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;
}
因此,我们可以使用isset数组\u键\u一起存在来检查它。别忘了检查这是不是数组

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';
  }

}

这对我来说是合理的。我使用相同的技巧获取带有默认值的$\u POST或$\u get params。在你添加所有的噱头之前,你的问题更好。是的,一个函数调用和两个必需的参数将是最小的。谁在没有评论的情况下否决了这个?Rip“函数”版本不会节省任何时间/空间。@MarcB,我认为
$val=array\u get($arr,$key)读起来比
$val=isset($arr[$key])更好$arr[$key]:空。我认为这样做可以节省时间/空间,还可以节省时间/空间。我熟悉这项技术,好吧,对于具有默认值的assoc数组来说,这很好,但并不总是要定义默认值。这个解决方案不适用于我的
$val=$arr[5]
示例。@naomik有趣的是,你什么时候不知道一段代码需要什么键?我没有投票反对,但你需要使用
返回isset($value)?…
而不是
返回$value?…
@naomik为什么我们需要使用isset?请解释一下?我们使用“?”-表达式(expr1)?(expr2):(expr3)如果expr1计算为TRUE,则计算为expr2;如果expr1计算为false,则计算为false如果
$value
计算为“false”值(
0
false
'
),则函数将返回
null
。谢谢您的回答!!)我编辑我的答案并为数组和空值添加检查键。请检查并回答我的解决方案)
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)