2013-05-07 14 views
7

Ho un array associativo nel quale ho bisogno di contare il numero di valori veri booleani all'interno.Numero di conteggi PHP in una matrice booleana

Il risultato finale è creare un'istruzione if in cui restituisce true quando esiste un solo valore true all'interno dell'array. Dovrebbe restituire false se ci sono più di un valore vero all'interno dell'array, o se non ci sono valori veri all'interno dell'array.

So che il percorso migliore sarebbe utilizzare count e in_array in qualche modo. Non sono sicuro che funzionerebbe, solo in cima alla mia testa, ma anche se lo fosse, è questo il modo migliore?

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

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

risposta

26

Vorrei usare array_filter.

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

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

Array_filter rimuoverà valori che sono false-y (valore == false). Quindi prendi un conteggio. Se è necessario filtrare in base ad un valore speciale, come se si cerchi un valore specifico, array_filter accetta un secondo parametro facoltativo che è una funzione che è possibile definire per restituire se un valore è true (non filtrato) o falso (filtrato).

+0

Perfetto, esattamente quello di cui avevo bisogno, grazie! – ThatTechGuy

0

come questo?

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

Prova questo approccio:

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

Risultato:

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

Documentation

+1

Questo funziona per stringhe/numeri interi, tuttavia essi cercano valori booleani. Quindi questo genererà un E_WARNING per ogni elemento non una stringa/int. Esempio: http://codepad.viper-7.com/zPTF0U –

0

Hai provato a usare array_count_values per ottenere un array con tutto contato? Quindi controlla quanti veri ci sono?

+0

Questo non funzionerà con valori booleani, solo stringa e intero. – Mark

7

Dal TRUE è realizzata mediante fusione a 1 e FALSE è colato a 0. È inoltre possibile utilizzare array_sum

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

Dalla doc: "FALSE produrrà 0 (zero), e vera volontà produrrà 1 (uno) ".

+0

Questo avrebbe funzionato altrettanto bene, grazie per la fornitura! – ThatTechGuy

+1

Questa è in realtà una soluzione piuttosto intelligente. Complimenti! – lgomezma

Problemi correlati