2013-05-07 14 views
7

Mam tablicę asocjacyjną, w której muszę policzyć liczbę wartości logicznych prawdziwych w obrębie.Liczba w PHP Liczba prawdziwych wartości w tablicy Boolean

Rezultatem końcowym jest utworzenie instrukcji if, która zwróci wartość true, jeśli w tablicy istnieje tylko jedna prawdziwa wartość. Musiałby zwrócić wartość false, jeśli w tablicy jest więcej niż jedna wartość true lub jeśli w tablicy nie ma żadnych wartości true.

Wiem, że najlepszą trasą byłoby użycie count i in_array w jakiejś formie. Nie jestem pewien, czy to zadziała, tylko ze szczytu mojej głowy, ale nawet jeśli tak, to czy to najlepszy sposób?

$array(a->true,b->false,c->true)  

if (count(in_array(true,$array,true)) == 1) 
{ 
    return true 
} 
else 
{ 
    return false 
} 

Odpowiedz

26

Chciałbym użyć array_filter.

$array = array(true, true, false, false); 
echo count(array_filter($array)); 
//outputs: 2 

http://codepad.viper-7.com/ntmPVY

Array_filter usunie wartości, które są fałszywie r (== wartość fałsz). Więc po prostu policz. Jeśli potrzebujesz filtrować w oparciu o jakąś wartość specjalną, np. Jeśli szukasz określonej wartości, to array_filter akceptuje opcjonalny drugi parametr, który jest funkcją, którą możesz zdefiniować, aby zwrócić wartość true (niefiltrowaną) lub false (odfiltrowaną)).

+0

Doskonały, dokładnie to, czego potrzebowałem, dzięki! – ThatTechGuy

0

w ten sposób?

$trues = 0; 
foreach((array)$array as $arr) { 
    $trues += ($arr ? 1 : 0); 
} 
return ($trues==1); 
2

Spróbuj podejście:

<?php 
$array = array(1, "hello", 1, "world", "hello"); 
print_r(array_count_values($array)); 
?> 

Wynik:

Array 
(
    [1] => 2 
    [hello] => 2 
    [world] => 1 
) 

Documentation

+1

Działa to dla ciągów/liczb całkowitych, jednak szukają wartości logicznych. Tak więc rzuci to E_WARNING dla każdego elementu, a nie ciągu/int. Przykład: http://codepad.viper-7.com/zPTF0U –

0

Czy próbowali za pomocą array_count_values uzyskać tablicę z wszystko liczone? Następnie sprawdź, ile jest prawdziwych?

+0

Nie będzie działać dla wartości logicznych, tylko łańcuch i liczba całkowita. – Mark

7

Od PRAWDA jest rzutować na 1 i FAŁSZ jest lanego 0. Można również użyć array_sum

$array = array('a'=>true,'b'=>false,'c'=>true); 
if(array_sum($array) == 1) { 
    //one and only one true in the array 
} 

Z doc: „FAŁSZ przyniesie 0 (zero), a TRUE przyniesie 1 (jeden) . "

+0

To zadziałałoby równie dobrze, dzięki za rezerwę! – ThatTechGuy

+1

To jest całkiem sprytne rozwiązanie. Sława! – lgomezma