2011-08-14 10 views

Odpowiedz

15

Przypuszczam można użyć array_filter() dostać tablicę wszystkich elementów, które są niezerowe; i użyj empty() w tej wynikowej tablicy, aby określić, czy jest pusta, czy nie.


Na przykład, w przykładowej tablicy:

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

stosując następujący fragment kodu:

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

pokaże Ci pustą tablicę, nie zawierającego elementu niezerową:

array(0) { 
} 

I użycie czegoś takiego:

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

dostanie się następujący wynik:

All zeros! 


Z drugiej strony, o następującej tablicy:

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

$ tmp tablica będzie zawierać:

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

I jako taki nie byłby pusty.


Zauważ, że nie przekazując wywołania zwrotnego jako drugi parametr do array_filter() zadziała ponieważ (cytowanie):

Jeśli nie zwrotna jest dostarczany, wszystkie wpisy z wejścia równy FAŁSZ (patrz converting to boolean) będzie usunięty.

+0

Nie ma za co :-) –

+2

Ale bez prawidłowego oddzwonienia tablica pustych ciągów/pustych tablic/wartości FAŁSZ/NULL będzie również traktowana jako tablica zer. –

+0

prawda; które mogą lub nie mogą być zaakceptowane dla PO; więc, dzięki za komentarz! –

3

Użyj tego:

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

Jest to o wiele szybciej (czas pracy) niż przy użyciu array_filter jak zasugerowano w drugiej odpowiedzi.

+0

Hmmmm. Znam tę metodę, ale chcę szybkiej metody jednej linii .. W każdym razie dzięki .. – Student

2

można pętla tablica i zjazd na pierwszej niezerowej wartości (pętle aż niezerowe, więc dość szybko, gdy niezerową wartość jest na początku tablicy):

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

lub użyć array_sum (pętle pełna macierz raz)

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

@fireeyedboy miał bardzo dobry punkt o zsumowanie: jeśli zaangażowane są wartości ujemne, wynik może być bardzo dobrze do zera, mimo że tablica składa się z niezerowej wartości

+1

Myślałem również o 'tablicy_sum', ale' tablica ("a '=> 2," b "=> -2)' spowoduje '0' również. –

+0

@fireeyedboy: bardzo dobry punkt! – knittl

1

inny sposób:

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

Jak o:

// 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

Jestem trochę późno do partii, ale jak o tym:

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

Podobna sztuczka wykorzystuje array_unique().

0

Można użyć tej funkcji

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

Innym rozwiązaniem może być szybkie:

if (intval(emplode('',$array))) { 
    // at least one non zero array item found 
} else { 
    // all zeros 
} 
Powiązane problemy