【问题标题】:How to check if a multidimensional array is empty or not?如何检查多维数组是否为空?
【发布时间】:2013-08-26 10:21:26
【问题描述】:

基本上,我有一个多维数组,我需要检查它是否只是空的。

我目前有一个 if 声明试图这样做:

if(!empty($csv_array)) 
{   
    //My code goes here if the array is not empty
}

虽然,不管多维数组是否为空,if statement 都会被激活。

这是数组为空时的样子:

Array
(
    [0] => Array
        (
        )

)

这是数组中包含一些元素时的样子:

Array
(
    [0] => Array
        (
        )

    [1] => Array
        (
            [1] => question1
            [2] => answer1
            [3] => answer2
            [4] => answer3
            [5] => answer4
        )

    [2] => Array
        (
            [1] => question2
            [2] => answer1
            [3] => answer2
            [4] => answer3
            [5] => answer4
        )

    [3] => Array
        (
            [1] => question3
            [2] => answer1
            [3] => answer2
            [4] => answer3
            [5] => answer4
        )

)

我的数组元素总是从 1 开始,而不是 0。长话短说为什么,没有必要解释,因为它与这个问题无关。

如果需要,这是创建数组的代码。它是从上传的 CSV 文件中提取的。

$csv_array = array(array());
if (!empty($_FILES['upload_csv']['tmp_name'])) 
{
    $file = fopen($_FILES['upload_csv']['tmp_name'], 'r');
}

if($file)
{
    while (($line = fgetcsv($file)) !== FALSE) 
    {
        $csv_array[] = array_combine(range(1, count($line)), array_values($line));
    }

    fclose($file);
}

所以总而言之,我需要修改我的if statement 来检查数组是否为空。

提前致谢!

【问题讨论】:

  • 你试过if(!empty($csv_array[0]))吗?
  • @Bora 永远不会被执行...因为 OP 说它的 o 索引总是空的...
  • 如果你的文件在空的时候有固定的格式,你可以找到一个包含文件的空数组占用的大小,并用它来判断你的数组是否为空?这只是一种 hack-y 方法,这些方法就是您所说的开箱即用的方法;)尽管要使此方法起作用,您需要确保在数组为空时文件内容大小是恒定的。 :)

标签: php arrays multidimensional-array


【解决方案1】:

您可以过滤数组,默认情况下这将删除所有空值。然后你可以检查它是否为空:

$filtered = array_filter($csv_array);
if (!empty($filtered)) {
  // your code
}

注意:这将适用于您问题中发布的代码,如果您向其中一个为空的数组添加另一个维度,则不会:

$array = array(array()); // empty($filtered) = true;
$array = array(array(array())); // empty($filtered) = false;

【讨论】:

  • 如果您不知道您的数据是什么或将存在哪些索引,这是更好的答案。谢谢。
【解决方案2】:

所以只需检查第一个键是否存在于数组中。

示例

if(!empty($csv_array[1])) 
{   
    //My code goes here if the array is not empty
}

【讨论】:

  • 绝对是最简单的方法。不敢相信我没有想到这个哈哈。谢谢老哥!
  • 变量没有设置怎么办?这可能会引发错误通知。
【解决方案3】:

如果你不知道多维数组的结构

public function isEmpty(array $array): bool
{
    $empty = true;

    array_walk_recursive($array, function ($leaf) use (&$empty) {
        if ($leaf === [] || $leaf === '') {
            return;
        }

        $empty = false;
    });

    return $empty;
}

请记住,所有叶节点都会被解析。

【讨论】:

【解决方案4】:

只是为了保存,您希望它删除空行吗?或者如果任何数组为空,您是否要返回?或者你需要一个列表哪些职位是空的?

这只是一个想法,而且!!!未测试!!!

/**
 * multi array scan 
 * 
 * @param $array array
 * 
 * @return bool
 */
function scan_array($array = array()){
  if (empty($array)) return true;

  foreach ($array as $sarray) {
    if (empty($sarray)) return true;
  } 

  return false;
}

【讨论】:

    【解决方案5】:

    组合 array_filter()array_map() 以获得结果。 (Result Test)

    <?php
        $arrayData = [
            '0'=> [],
            '1'=> [
                'question1',
                'answer1',
                'answer2',
                'answer3',
                'answer4'
            ],
            '2'=> [
                'question1',
                'answer1',
                'answer2',
                'answer3',
                'answer4'
            ]
        ];
    
        $arrayEmpty = [
            '0' => [],
            '1' => [
                '1' => '',
                '2' => '',
                '3' => ''
            ]
        ];
    
        $resultData = array_filter(array_map('array_filter', $arrayData));
        $resultEmpty = array_filter(array_map('array_filter', $arrayEmpty));
    
        var_dump('Data', empty($resultData));
        var_dump('Empty', empty($resultEmpty));
    

    【讨论】:

      【解决方案6】:

      你可以使用array_push来避免这种情况,

      $result_array = array();
      

      array_push($result_array,$new_array);

      参考array_push

      然后你可以使用 if (!empty($result_array)) { }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-28
        • 2018-11-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多