PHP:测试多维数组中是否存在单元格

问题描述 投票:25回答:3

我有一个有很多维度的数组,我想测试一个单元格的存在。

下面的级联方法肯定是一种安全的方法:

if (array_key_exists($arr, 'dim1Key'))  
  if (array_key_exists($arr['dim1Key'], 'dim2Key'))  
    if (array_key_exists($arr['dim1Key']['dim2Key'], 'dim3Key'))  
      echo "cell exists";  

但是有更简单的方法吗?

我将详细介绍这个:

  1. 我可以在一个声明中执行此检查吗?
  2. 我是否必须使用array_key_exist或者我可以使用像isset这样的东西吗?我什么时候使用,为什么?
php multidimensional-array
3个回答
72
投票

qazxsw poi是规范的测试方法,即使对于多维数组也是如此。除非您需要确切地知道缺少哪个尺寸,否则就像

isset()

是完全可以接受的,即使isset($arr[1][2][3]) [1]元素不存在(除非有1和2,否则3不存在)。

但是,如果你有

[2]

然后

$arr['a'] = null;

评论跟进:

也许这个类比会有所帮助。将PHP变量(实际变量,数组元素等)视为纸板箱:

  • isset($arr['a']); // false array_key_exists('a', $arr); // true 在盒子里面查看并确定盒子的内容是否可以被类型化为“非空”。它不关心盒子是否存在 - 它只关心盒子的内容。如果该框不存在,那么它显然不能包含任何内容。
  • isset()检查盒子本身是否存在。盒子的内容是无关紧要的,它正在检查纸板的痕迹。

6
投票

我遇到了同样的问题,除了我需要一些Drupal的东西。我还需要检查对象是否包含项目以及数组。这是我制作的代码,它是一个递归搜索,用于查看对象是否包含值以及数组。以为有人可能觉得它很有用。

array_key_exists()

使用:例如

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;
}

在我的drupal案例中,这对我来说意味着存在以下变量

recursiveIsset($variables, array('content', 'body', '#object', 'body', 'und'))

应该注意,仅仅因为'#object'被称为对象并不意味着它是。如果此位置存在,我的递归搜索也将返回true

$variables['content']['body']['#object']->body['und']

0
投票

如果你想检查$variables->content->body['#object']->body['und'] ,为了安全起见,你需要在$arr['dim1Key']['dim2Key']['dim3Key']之前检查是否所有数组都存在。然后你可以使用dim3Key

所以是的,使用单个array_key_exists语句有一种更简单的方法,如下所示:

if
© www.soinside.com 2019 - 2024. All rights reserved.