2011-08-14 8 views

Respuesta

15

supongo que se podría utilizar array_filter() para obtener una matriz de todos los elementos que no son cero; y use empty() en esa matriz resultante, para determinar si está vacía o no.


Por ejemplo, con su matriz de ejemplo:

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

Usando la siguiente porción de código:

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

¿Le mostrará un conjunto vacío, que no contiene ningún elemento distinto de cero:

array(0) { 
} 

Y usando algo como esto:

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

le conseguiría el siguiente resultado:

All zeros! 


Por otro lado, con la siguiente matriz:

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

El $ tmp contendría:

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

Y, como tal, no estaría vacío.


en cuenta que no pasa una devolución de llamada como segundo parámetro a array_filter() funcionará porque (donde se cita):

Si no se suministra de devolución de llamada, todas las entradas de entrada igual a FALSE (ver converting to boolean) será eliminado.

+0

De nada :-) –

+2

Pero sin la devolución de llamada adecuada, la matriz de cadenas vacías/matrices vacías/valores FALSOS/NULOS también se tratarán como una matriz de ceros. –

+0

cierto; eso puede o no ser aceptable para el OP; entonces, gracias por tu comentario! –

3

Utilice esta:

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

Esto es mucho más rápido (tiempo de ejecución) que el uso de array_filter como se sugiere en otra respuesta.

+0

Hmmmm. Conozco este método pero quiero un método rápido de una línea ... De todos modos, gracias ... – Student

2

puede recorrer la matriz y de salida en el primer valor que no sea cero (un bucle hasta que no sea cero, de modo bastante rápido, cuando un valor distinto de cero está en el comienzo de la matriz):

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

o, utilizar array_sum (bucles matriz completa una vez):

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

@fireeyedboy tenían un muy buen punto sobre la suma total: si se trata de valores negativos, el resultado puede muy bien ser cero, a pesar de que la matriz consiste en que no sea cero valora

+1

Pensé en 'array_sum' también, pero' array ('a' => 2, 'b' => -2) 'dará como resultado '0' también. –

+0

@fireeyedboy: muy buen punto! – knittl

1

Otra forma:

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

Cómo sobre: ​​

// ditch the last argument to array_keys if you don't need strict equality 
$allZeroes = count($data) == count(array_keys($data, '0', true)); 
0
if (!array_filter($data)) { 
    // empty (all values are 0, NULL or FALSE) 
} 
else { 
    // not empty 
} 
0

estoy un poco tarde a la fiesta, pero ¿qué tal esto:

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

Un truco similar utiliza array_unique().

0

Puede utilizar esta función

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

Otra solución rápida podría ser:

if (intval(emplode('',$array))) { 
    // at least one non zero array item found 
} else { 
    // all zeros 
} 
Cuestiones relacionadas