我有一个包含多个维度的数组,我想测试一个单元格的存在。
下面的级联方法肯定是一种安全的方法:
if (array_key_exists($arr, 'dim1Key'))
if (array_key_exists($arr['dim1Key'], 'dim2Key'))
if (array_key_exists($arr['dim1Key']['dim2Key'], 'dim3Key'))
echo "cell exists";
但是有更简单的方法吗?
我会详细介绍这个:
答案 0 :(得分:72)
isset()
是一种经典的测试方法,即使对于多维数组也是如此。除非你需要确切地知道缺少哪个维度,否则就像
isset($arr[1][2][3])
是完全可以接受的,即使[1]
和[2]
元素不存在(除非有1和2,否则3不存在)。
但是,如果你有
$arr['a'] = null;
然后
isset($arr['a']); // false
array_key_exists('a', $arr); // true
评论后续:
也许这个比喻会有所帮助。将PHP变量(实际变量,数组元素等)视为纸板箱:
isset()
查看框内部并确定框的内容是否可以强制转换为“非空”。它不关心盒子是否存在 - 它只关心盒子的内容。如果该框不存在,那么它显然不能包含任何内容。array_key_exists()
检查框本身是否存在。盒子的内容是无关紧要的,它正在检查纸板的痕迹。答案 1 :(得分:6)
我遇到了同样的问题,除了我需要一些Drupal的东西。我还需要检查对象是否包含项目以及数组。这是我制作的代码,它是一个递归搜索,用于查看对象是否包含值以及数组。以为有人可能觉得它很有用。
function recursiveIsset($variable, $checkArray, $i=0) {
$new_var = null;
if(is_array($variable) && array_key_exists($checkArray[$i], $variable))
$new_var = $variable[$checkArray[$i]];
else if(is_object($variable) && array_key_exists($checkArray[$i], $variable))
$new_var = $variable->$checkArray[$i];
if(!isset($new_var))
return false;
else if(count($checkArray) > $i + 1)
return recursiveIsset($new_var, $checkArray, $i+1);
else
return $new_var;
}
使用:例如
recursiveIsset($variables, array('content', 'body', '#object', 'body', 'und'))
在我的drupal案例中,对我来说,存在以下变量
$variables['content']['body']['#object']->body['und']
值得注意的是,仅仅因为'#object'被称为对象并不意味着它是。如果此位置存在,我的递归搜索也将返回
$variables->content->body['#object']->body['und']
答案 2 :(得分:0)
如果要检查$arr['dim1Key']['dim2Key']['dim3Key']
,为了安全起见,需要检查所有数组是否都在dim3Key
之前。然后,您可以使用array_key_exists
。
是的,有一种使用单个if
语句的简单方法,如下所示:
if (isset($arr['dim1Key']['dim2Key']) &&
array_key_exists('dim3Key', $arr['dim1Key']['dim2Key'])) ...
答案 3 :(得分:0)
要获得一个快速班轮,您可以使用has method中的this array library:
Arr::has('dim1Key.dim2Key.dim3Key')
最大的好处是您可以使用点表示法来指定数组键,从而使事情变得更简单,更优雅。
此外,此方法将按预期的null
值工作,因为它在内部使用array_key_exists
。
答案 4 :(得分:0)
我更喜欢创建如下所示的辅助函数:
function my_isset_multi( $arr,$keys ){
foreach( $keys as $key ){
if( !isset( $arr[$key] ) ){
return false;
}
$arr = $arr[$key];
}
return $arr;
}
然后在我的代码中,我首先使用上面的函数检查数组,如果没有返回false,则返回数组本身。
想象一下你有这样的数组:
$arr = array( 'sample-1' => 'value-1','sample-2' => 'value-2','sample-3' => 'value-3' );
你可以这样写:
$arr = my_isset_multi( $arr,array( 'sample-1','sample-2','sample-3' ) );
if( $arr ){
//You can use the variable $arr without problems
}
函数 my_isset_multi 将检查数组的每一层,如果没有设置键,则返回 false。