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:测试多维数组中是不是存在单元格的主要内容,如果未能解决你的问题,请参考以下文章

php如何判断多维数组中是不是存在字符串

检查多维数组的任何子数组中的特定键是不是存在特定值

如何在html表中创建多维数组

在表视图内的集合视图中传递多维数组

php怎样判断多维数组是不是为空

python怎么操作多维数组元素