web-dev-qa-db-fra.com

Vérifier si toutes les valeurs du tableau sont identiques

Je dois vérifier si toutes les valeurs d'un tableau sont égales.

Par exemple:

$allValues = array(
    'true',
    'true',
    'true',
);

Si chaque valeur du tableau est égale à 'true', alors je veux faire écho à 'all true'. Si une valeur du tableau est égale à 'false', alors je veux faire écho à 'some false'

Une idée sur comment je peux faire ça?

43
Nick

toutes les valeurs sont égales à la valeur de test

if (count(array_unique($allvalues)) === 1 && end($allvalues) === 'true') {


}

ou simplement tester l'existence de ce que vous ne voulez pas.

if (in_array('false', $allvalues, true)) {

}

Préférez cette dernière méthode si vous êtes certain qu'il ne peut y avoir que 2 valeurs possibles dans le tableau, car c'est beaucoup plus efficace. Mais en cas de doute, un programme lent vaut mieux qu'un programme incorrect, utilisez donc la première méthode.

Si vous ne pouvez pas utiliser la deuxième méthode, votre tableau est très grand et son contenu est probable avoir plus d'une valeur (surtout si la valeur est susceptible de se produire au début de tableau), il peut être beaucoup plus rapide de procéder comme suit: 

function isHomogenous($arr) {
    $firstValue = current($arr);
    foreach ($arr as $val) {
        if ($firstValue !== $val) {
            return false;
        }
    }
    return true;
}

* remarque - Certaines réponses interprètent la question initiale comme 1) how to check if all values are the same, alors que d'autres l'interprètent comme 2) how to check if all values are the same AND make sure that value equals the test value. La solution que vous choisissez doit tenir compte de ce détail. Mes deux premières solutions ont répondu # 2. Ma fonction isHomogenous() répond à la question n ° 1, bien que vous puissiez la modifier pour donner la réponse n ° 2 en transmettant la valeur de $firstValue comme valeur de test, au lieu d'utiliser la première valeur trouvée dans le tableau comme je l'ai fait.

105
goat

Si votre tableau contient des booléens réels (ou ints) au lieu de chaînes, vous pouvez utiliser array_sum :

$allvalues = array(TRUE, TRUE, TRUE);
if(array_sum($allvalues) == count($allvalues)) {
    echo 'all true';
} else {
    echo 'some false';
}

http://codepad.org/FIgomd9X

Cela fonctionne parce que TRUE sera évalué en tant que 1 et FALSE en tant que 0.

11
bfavaretto

De plus, vous pouvez condenser la réponse de chèvre si ce n'est pas un binaire: 

if (count(array_unique($allvalues)) === 1 && end($allvalues) === 'true') {
   // ...
}

à

if (array_unique($allvalues) === array('foobar')) { 
   // all values in array are "foobar"
}
8
user1718888

Pourquoi ne pas simplement comparer le nombre après avoir appelé array_unique()

Pour vérifier si tous les éléments d’un tableau sont identiques, procédez comme suit:

$allValuesAreTheSame = (count(array_unique($allvalues)) === 1);

Cela devrait fonctionner quel que soit le type de valeurs du tableau.

6
Werner

Vous pouvez comparer min et max ... pas le moyen le plus rapide; p

$homogenous = ( min($array) === max($array) );
3
quazardous

Une autre option:

function same($arr) {
    return $arr === array_filter($arr, function ($element) use ($arr) {
        return ($element === $arr[0]);
    });
}

Usage:

same(array(true, true, true)); // => true
0
Wayne Burkett
$alltrue = 1;
foreach($array as $item) {
    if($item!='true') { $alltrue = 0; }
}
if($alltrue) { echo("all true."); }
else { echo("some false."); }

Techniquement, cela ne vérifie pas "certains faux", mais "tous les vrais". Mais il semble que vous soyez pratiquement sûr que les seules valeurs que vous obtiendrez seront "true" et "false". 

0
octern