是否有一个方法来检查是否所有的数组项都是'0'


Is there a method to check if all array items are '0'?

我有一个数组

$data = array( 'a'=>'0', 'b'=>'0', 'c'=>'0', 'd'=>'0' );

我想检查是否所有的数组值都是0

if( all array values are '0' ) {
   echo "Got it";
} else {
  echo "No";
}

谢谢

我想你可以使用 array_filter() 来获得所有非零项的数组;并在生成的数组上使用 empty() 来确定它是否为空。


例如,使用示例数组:

$data = array( 
       'a'=>'0',
       'b'=>'0',
       'c'=>'0',
       'd'=>'0' );

使用以下部分代码:

$tmp = array_filter($data);
var_dump($tmp);

将显示一个空数组,不包含非零元素:

array(0) {
}

然后像这样使用:

if (empty($tmp)) {
    echo "All zeros!";
}

将得到以下输出:

All zeros!


另一方面,使用以下数组:

$data = array( 
    'a'=>'0', 
    'b'=>'1', 
    'c'=>'0', 
    'd'=>'0' );

$tmp数组将包含:

array(1) {
  ["b"]=>
  string(1) "1"
}

And不能为空。


请注意,不将回调作为第二个参数传递给array_filter()将工作,因为(引用):

如果没有提供回调,所有输入项都等于FALSE(参见转换为布尔值将被删除。

如何:

// ditch the last argument to array_keys if you don't need strict equality
$allZeroes = count( $data ) == count( array_keys( $data, '0', true ) );

使用

$all_zero = true;
foreach($data as $value)
    if($value != '0')
    {
        $all_zero = false;
        break;
    }
if($all_zero)
    echo "Got it";
else
    echo "No";

这比在其他答案中建议使用array_filter要快得多(运行时间)。

你可以循环数组并在第一个非零值时退出(循环直到非零,所以非常快,当数组的开始处有一个非零值时):

function allZeroes($arr) {
  foreach($arr as $v) { if($v != 0) return false; }
  return true;
}

或者,使用array_sum(循环完成数组一次):

function allZeroes($arr) {
  return array_sum($arr) == 0;
}

@fireeyedboy关于求和有一个很好的观点:如果涉及到负值,结果很可能是零,即使数组由非零值组成

另一种说法:

if(array_fill(0,count($data),'0') === array_values($data)){
    echo "All zeros";
}

另一个快速解决方案可能是:

if (intval(emplode('',$array))) {
  // at least one non zero array item found
} else {
  // all zeros
}
if (!array_filter($data)) {
   // empty (all values are 0, NULL or FALSE)
}
else {
   // not empty
}

我来晚了一点,但是这个怎么样:

$testdata = array_flip($data);
if(count($testdata) == 1 and !empty($testdata[0])){
    // must be all zeros
}

类似的技巧使用array_unique()

你可以使用这个函数

function all_zeros($array){//true if all elements are zeros
    $flag = true;
    foreach($array as $a){
        if($a != 0)
            $flag = false;
    }
    return $flag;
}

您可以使用下面的一行代码:(Demo)

var_export(!(int)implode($array));

$array = [0, 0, 0, 0];返回true

$array = [0, 0, 1, 0];返回false

这可能会执行得很好,因为只有一个函数调用。

我的解决方案在内爆时不使用胶水,然后显式地将生成的字符串强制转换为整数,然后使用否定将0计算为真,非零计算为假。(通常,0的值为false,其他值为true。)

…但如果我是为了工作,我可能会使用!array_filter($array)