我有一个数组
$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)