是否有一种惯用的方法从PHP中的数组中获取可能未定义的键?

时间:2014-05-06 18:34:27

标签: php arrays idioms

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

我得了支气管炎。不是没有人有时间f'dat。


我可以创造一个功能,我猜......

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

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

4 个答案:

答案 0 :(得分:6)

更优雅的方式:

function ifsetor(&$value, $default = null) {
    return isset($value) ? $value : $default;
}

现在你可以这样做:

$value   = ifsetor($arr[$key]);
$message = ifsetor($_POST['message'], 'No message posted');

等。这里$value通过引用传递,因此它不会抛出通知。

进一步阅读:

答案 1 :(得分:1)

如果您需要确保某些键存在,那么您可以创建一个默认数组并合并输入(或其他)。这样,所有必要的密钥都将存在,如果可能,它们将被更新:

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

$data = array_merge($defaults, $someOtherArray);

array_merge()的文档:http://php.net/array_merge

我在考虑HTML表单上的复选框时发现这有用,这些复选框可能会显示在$_GET$_POST中。

请注意,此过程需要字符串数组键,而不是数字键。请参阅文档以获得说明。

答案 2 :(得分:1)

不要忘记函数 isset()对于 NULL 值对应的数组键不返回TRUE,而 array_key_exists()的确如此。因此,以上所有答案都不能纠正数组中 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)

答案 3 :(得分:0)

如果使用$_GET$_POST$_COOKIE$_SERVER$_ENV,它已经是内置函数,您可以使用:

$value = filter_input(INPUT_GET, $key);

另外它还有更多功能。如果您还想在同一作业中验证或清理过滤器,则可选过滤器会使其变得更方便。

  

返回 - 成功时请求变量的值,如果过滤器失败则返回FALSE,   如果未设置variable_name变量,则返回NULL。如果是旗帜   使用FILTER_NULL_ON_FAILURE,如果变量为,则返回FALSE   如果过滤器失败,则不设置和NULL。