Php 检查空数组的最佳方法?

Php 检查空数组的最佳方法?,php,arrays,recursion,Php,Arrays,Recursion,如何递归检查数组中的空内容,如以下示例所示: Array ( [product_data] => Array ( [0] => Array ( [title] => [description] => [price] => )

如何递归检查数组中的空内容,如以下示例所示:

Array
(
    [product_data] => Array
        (
            [0] => Array
                (
                    [title] => 
                    [description] => 
                    [price] => 
                )

        )
    [product_data] => Array
        (
            [1] => Array
                (
                    [title] => 
                    [description] => 
                    [price] => 
                )

        )

)
数组不是空的,但没有内容。我如何用一个简单的函数来检查这一点


谢谢

假设数组始终包含相同类型的数据:

function TestNotEmpty($arr) {
    foreach($arr as $item)
        if(isset($item->title) || isset($item->descrtiption || isset($item->price))
            return true;
    return false;
}

短路包括在内

function hasValues($input, $deepCheck = true) {
    foreach($input as $value) {
        if(is_array($value) && $deepCheck) {
            if($this->hasValues($value, $deepCheck))
                return true;
        }
        elseif(!empty($value) && !is_array($value))
            return true;
    }
    return false;
}

这是我的版本。一旦它在数组中找到一个非空字符串,它就会停止。另外,它会正确地检查空字符串,因此0(零)不会被视为空字符串(如果使用empty()函数,则会被视为空字符串)。顺便说一句,即使仅对字符串使用此函数,多年来也被证明是非常宝贵的

function isEmpty($stringOrArray) {
    if(is_array($stringOrArray)) {
        foreach($stringOrArray as $value) {
            if(!isEmpty($value)) {
                return false;
            }
        }
        return true;
    }

    return !strlen($stringOrArray);  // this properly checks on empty string ('')
}

如果阵列只有一级深度,则还可以执行以下操作:

if (strlen(implode('', $array)) == 0)

在大多数情况下有效:)

如果有人偶然发现这个问题,需要检查整个数组是否为NULL,这意味着数组中的每一对都等于NULL,这是一个方便的函数。如果任何变量也返回NULL,您可以很容易地修改它以返回true。我需要一个特定的web表单,它更新了用户数据,并且它可以完全空白,因此不需要执行任何SQL

$test_ary = array("1"=>NULL, "2"=>NULL, "3"=>NULL);

function array_empty($ary, $full_null=false){
    $null_count = 0;
    $ary_count = count($ary);

    foreach($ary as $value){
        if($value == NULL){
            $null_count++;
        }
    }

    if($full_null == true){
        if($null_count == $ary_count){
            return true;
        }else{
            return false;
        }
    }else{
        if($null_count > 0){
            return true;
        }else{
            return false;
        }
    }
}

$test = array_empty($test_ary, $full_null=true);
echo $test;

使用数组\u walk\u递归的解决方案:

function empty_recursive($value)
{
        if (is_array($value)) {
                $empty = TRUE;
                array_walk_recursive($value, function($item) use (&$empty) {
                        $empty = $empty && empty($item);
                });
        } else {
                $empty = empty($value);
        }
        return $empty;
}

如果传递的变量不是数组,或者任何嵌套数组包含值(包括falsy值!),则返回
TRUE
。否则返回
FALSE
。 短路

function has_values($var) {
  if (is_array($var)) {
    if (empty($var)) return FALSE;
    foreach ($var as $val) {
      if(has_values($val)) return TRUE;
    }
    return FALSE;
  } 
  return TRUE;
}

下面是一个很好的实用函数,如果数组为空,它将返回
true(1)
,如果数组为空,则返回
false(0)

function is_array_empty( $mixed ) {
    if ( is_array($mixed) ) {
        foreach ($mixed as $value) {
            if ( ! is_array_empty($value) ) {
                return false;
            }
        }
    } elseif ( ! empty($mixed) ) {
        return false;
    }

    return true;
}
例如,给定多维数组:

$products = array(
    'product_data' => array(
        0 => array(
            'title' => '',
            'description' => null,
            'price' => '',
        ),
    ),
);
您将从
is\u array\u empty()
返回一个
true
值,因为没有设置值:

var_dump( is_array_empty($products) );

在以下位置以交互方式查看此代码:

我需要一个函数来递归过滤数组中的非空值

这是我的递归函数:

function filterArray(array $array, bool $keepNonArrayValues = false): array {
  $result = [];
  foreach ($array as $key => $value) {
    if (is_array($value)) {
      $value = $this->filterArray($value, $keepNonArrayValues);
    }

    // keep non empty values anyway
    // otherwise only if it is not an array and flag $keepNonArrayValues is TRUE 
    if (!empty($value) || (!is_array($value) && $keepNonArrayValues)) {
      $result[$key] = $value;
    }
  }

  return array_slice($result, 0)
}
使用参数
$keepNonArrayValues
可以决定数组中是否保留
0
(数字零)、
'
(空字符串)或
false
(bool false)等值。换句话说:如果
$keepNonArrayValues=true
只有空数组将从目标数组中删除

array\u slice($result,0)
的作用是重新排列数值索引(0..length-1)


此外,通过此函数筛选数组后,可以使用
空($filterredArray)

测试数组。为什么您的数组有两个相同的键
product_data
?@codaddict:观察得很好。抱歉,我只复制了文本,例如:-)p.S:我比其他人更喜欢这个社区!!一个比我的解决方案更通用、更容错的解决方案:),但您能否不短路它并立即返回一个非空答案,而不是继续测试阵列的其余部分?foreach($InputVariable as$Value)@David Martenson:如果给函数的变量不是数组,那么执行只会被路由到else语句。将问题中给出的数组视为一棵树,将else块视为计算所有叶子的基本情况。是的,但如果它是一个数组,它将完成该数组以及层次结构中更高的每个数组,即使它可能已经发现它不是空的。他的例子清楚地说明了可以有空行,但它们仍然应该被认为是空的。啊,我明白你的意思了。是的,你说得对。一旦找到非空元素,就应该停止比较并返回false。我的实现将不必要地继续检查非空元素,直到它遍历整个结构。多维阵法怎么样?@sonnb:你要仔细阅读:一级!=多维/多层次。答案中最优雅的设置。一个干净完美的问题解决方案。
var_dump( is_array_empty($products) );
function filterArray(array $array, bool $keepNonArrayValues = false): array {
  $result = [];
  foreach ($array as $key => $value) {
    if (is_array($value)) {
      $value = $this->filterArray($value, $keepNonArrayValues);
    }

    // keep non empty values anyway
    // otherwise only if it is not an array and flag $keepNonArrayValues is TRUE 
    if (!empty($value) || (!is_array($value) && $keepNonArrayValues)) {
      $result[$key] = $value;
    }
  }

  return array_slice($result, 0)
}