PHP:测试多维数组中是不是存在单元格
Posted
技术标签:
【中文标题】PHP:测试多维数组中是不是存在单元格【英文标题】:PHP: testing for existence of a cell in a multidimensional arrayPHP:测试多维数组中是否存在单元格 【发布时间】:2011-06-02 09:03:50 【问题描述】:我有一个具有多个维度的数组,我想测试一个单元格的存在。
以下级联方法肯定是一种安全的方法:
if (array_key_exists($arr, 'dim1Key'))
if (array_key_exists($arr['dim1Key'], 'dim2Key'))
if (array_key_exists($arr['dim1Key']['dim2Key'], 'dim3Key'))
echo "cell exists";
但是有没有更简单的方法?
我会详细介绍这个:
-
我可以在一个语句中执行此检查吗?
我必须使用 array_key_exist 还是可以使用 isset 之类的东西?我什么时候使用它们?为什么?
【问题讨论】:
【参考方案1】:我更喜欢创建如下的辅助函数:
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会检查数组的每一层,如果没有设置key,它会返回false。
【讨论】:
【参考方案2】:对于快速的一个班轮,您可以使用来自this array library 的has method:
Arr::has('dim1Key.dim2Key.dim3Key')
最大的好处是您可以使用点表示法来指定数组键,这使事情变得更简单、更优雅。
此外,此方法对于 null
值也可以正常工作,因为它在内部使用 array_key_exists
。
【讨论】:
【参考方案3】:如果要检查$arr['dim1Key']['dim2Key']['dim3Key']
,为了安全起见,您需要检查dim3Key
之前是否存在所有数组。然后你可以使用array_key_exists
。
所以是的,有一种更简单的方法,使用单个 if
语句,如下所示:
if (isset($arr['dim1Key']['dim2Key']) &&
array_key_exists('dim3Key', $arr['dim1Key']['dim2Key'])) ...
【讨论】:
【参考方案4】:我遇到了同样的问题,除了一些 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'))
在我的情况下,我认为存在以下变量
$variables['content']['body']['#object']->body['und']
请注意,仅仅因为'#object'被称为对象并不意味着它是。如果此位置存在,我的递归搜索也将返回 true
$variables->content->body['#object']->body['und']
【讨论】:
【参考方案5】: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()
检查盒子本身是否存在。盒子里的东西无关紧要,它正在检查纸板的痕迹。
【讨论】:
谢谢。如果是这样,为什么要使用 array_key_exists? @gidireich:正是出于这个原因。能够区分现有的密钥和具有null
值的密钥,以及根本不存在的密钥。如果您关心它,这只是一个原因。
用isset
检查键和值是否存在或不为空,用array_key_exists
检查键是否存在,无论值是否为null
以上是关于PHP:测试多维数组中是不是存在单元格的主要内容,如果未能解决你的问题,请参考以下文章