2010-12-13 7 views
8

Muszę sprawdzić duże tablice, aby sprawdzić, czy są w 100% wypełnione wartościami liczbowymi. Jedyny sposób, który przychodzi mi do głowy to foreach, a następnie jest numeryczny dla każdej wartości, ale czy jest to najszybszy sposób?Jaki jest najszybszy sposób sprawdzenia, czy wszystkie wartości w tablicy są numeryczne?

+2

* Dowolne * rozwiązanie tego problemu spowoduje zapętlenie wartości tablicowych. Niezależnie od tego, czy musisz zrobić to w kodzie, czy funkcji, to jest to dla ciebie kolejne pytanie, ale w obu przypadkach jest pętla. Sądzę więc, że wydajność powinna być prawie taka sama, niezależnie od tego, co robisz. – Joey

+1

Co powiesz na sprawdzanie wartości przed ich wprowadzeniem do tablicy? –

+0

To nie jest takie proste, ponieważ wartości wchodzą i wychodzą z tablicy w sposób losowy, a niektóre z nich mogą mieć wartość zerową lub fałsz lub "", a następnie muszę wykonać z nimi obliczenia, a wynik tych obliczeń musi być zerowy, jeśli niektóre dane w tablicy nie są numeryczne. – rsk82

Odpowiedz

12

zakładając, że tablica jest jednowymiarowa i po prostu składa się z liczb całkowitych:

return ctype_digit(implode('',$array)); 
+1

Musiałem cofnąć mój głos, wartości 'false' i' NULL', które zwracają fałsz dla 'is_numeric()' są implodowane tutaj jako puste ciągi, uciekając 'ctype_digit()'. – BoltClock

+0

@BoltClock: OP zapewnia, że ​​tablica jest "w 100% wypełniona wartościami numerycznymi" – stillstanding

+1

Myślę, że operacja implodu jest dość kosztowna w czasie. – rsk82

-2

Najszybszym sposobem może być po prostu założyć, że są wszystkie cyfry i dalej ze swojej pracy. Jeśli twoja operacja nie powiedzie się później, to wiesz, że coś nie jest liczbą. Ale jeśli wszystkie są w rzeczywistości liczbami ... nie można uzyskać znacznie szybciej niż O (0)!

+0

Jednak niektóre wartości nieliczbowe prześlizgną się przez wsunięcie/autokonfigurowanie. Założenie nie jest bezpieczne. – Umbrella

+0

Dlaczego to zostało zaakceptowane jako odpowiedź? Nie sprawdza niczego ... –

-1

Ta mała funkcja działa dobrze dla mnie

function IsNumericarr($arr){ 
    if(!is_array($arr)){ 
     return false; 
    } 
    else{ 
     foreach($arr as $ar){ 
      if(!is_numeric($ar)){ 
       return false; 
       exit; 
      } 
     } 
     return true; 
    } 
} 

pętla jest potrzebne

4
array_map("is_numeric", array(1,2,"3","hello")) 

Array ([0] => 1 [1] => 1 [2] => 1 [3] =>) 
0
if(array_reduce($array, function($c, $v){return $c & (int)is_numeric($v);}, 1)) 
+0

Ta odpowiedź została automatycznie oznaczona jako niskiej jakości ze względu na jej długość i zawartość. Wyjaśnienie pomoże tej odpowiedzi bardziej przypominać odpowiedź przepełnienia stosu. – Popnoodles

2

Filtr tablica użyciu is_numeric. Jeśli rozmiar wyniku jest taki sam jak oryginał, wszystkie elementy są numeryczne:

$array = array(1, '2', '45'); 
if (count($array) === count(array_filter($array, 'is_numeric'))) { 
    // all numeric 
} 
Powiązane problemy