she*_*iel 29 php multidimensional-array
我有一个有很多维度的数组,我想测试一个单元格的存在.
下面的级联方法肯定是一种安全的方法:
if (array_key_exists($arr, 'dim1Key'))
if (array_key_exists($arr['dim1Key'], 'dim2Key'))
if (array_key_exists($arr['dim1Key']['dim2Key'], 'dim3Key'))
echo "cell exists";
Run Code Online (Sandbox Code Playgroud)
但是有更简单的方法吗?
我将详细介绍这个:
Mar*_*c B 75
isset()是一种经典的测试方法,即使对于多维数组也是如此.除非您需要确切地知道缺少哪个尺寸,否则就像
isset($arr[1][2][3])
Run Code Online (Sandbox Code Playgroud)
是完全可以接受的,即使[1]和那些[2]元素不存在(除非1和2存在,否则3不存在).
但是,如果你有
$arr['a'] = null;
Run Code Online (Sandbox Code Playgroud)
然后
isset($arr['a']); // false
array_key_exists('a', $arr); // true
Run Code Online (Sandbox Code Playgroud)
评论后续:
也许这个类比会有所帮助.将PHP变量(实际变量,数组元素等)视为纸板箱:
isset()查看框内部,并确定框的内容是否可以转换为"非空"的内容.它不关心盒子是否存在 - 它只关心盒子的内容.如果该框不存在,那么它显然不能包含任何内容.array_key_exists()检查盒子本身是否存在.盒子的内容是无关紧要的,它正在检查纸板的痕迹.小智 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;
}
Run Code Online (Sandbox Code Playgroud)
使用:例如
recursiveIsset($variables, array('content', 'body', '#object', 'body', 'und'))
Run Code Online (Sandbox Code Playgroud)
在我的drupal案例中,这对我来说存在以下变量
$variables['content']['body']['#object']->body['und']
Run Code Online (Sandbox Code Playgroud)
应该注意,仅仅因为'#object'被称为对象并不意味着它是.如果此位置存在,我的递归搜索也将返回true
$variables->content->body['#object']->body['und']
Run Code Online (Sandbox Code Playgroud)