Question

Est-il possible d'utiliser array_map () pour tester les valeurs d'un tableau? Je veux vous assurer que tous les éléments d'un tableau sont numériques.

Je l'ai essayé à la fois

$arrays = array(
         array(0,1,2,3 )
        , array ( 0,1, "a", 5 )
);

foreach ( $arrays as $arr ) {

        if ( array_map("is_numeric", $arr) === FALSE ) {
                echo "FALSE\n";
        } else {
                echo "TRUE\n";
        }
}

et

$arrays = array(
         array(0,1,2,3 )
        , array ( 0,1, "a", 5 )
);

foreach ( $arrays as $arr ) {

        if ( ( array_map("is_numeric", $arr) ) === FALSE ) {
                echo "FALSE\n";
        } else {
                echo "TRUE\n";
        }
}

Et pour les deux, je reçois

TRUE
TRUE

Peut-on faire? Si oui, qu'est-ce que je fais mal?

Note: Je suis conscient que je peux obtenir ma fonctionnalité désirée à partir d'une boucle foreach

.
Était-ce utile?

La solution

array_map renvoie un tableau. Ainsi, il sera toujours considéré comme « vrai ». Maintenant, si vous array_search pour FAUX, vous pourriez être en mesure d'obtenir les effets du désir.

De la PHP.net

array_map() returns an array containing all the elements of 
arr1 after applying the callback function to each one.

Cela signifie que vous avez actuellement un tableau qui contient vrai ou faux pour chaque élément. Vous devez utiliser array_search(false,$array) pour savoir s'il y a des fausses valeurs.

Autres conseils

Je suis habituellement un grand défenseur de array_map(), array_filter(), etc., mais dans ce cas foreach() va être le meilleur choix. La raison est que, avec array_map() et d'autres, il passera par l'ensemble du réseau, peu importe quoi. Mais pour vos besoins vous avez seulement besoin de passer par le tableau jusqu'à ce que vous exécutez dans une valeur pour laquelle is_numeric() retourne false, et pour autant que je sache, il n'y a aucun moyen en PHP pour sortir de ces méthodes.

En d'autres termes, si vous avez 1000 articles dans votre tableau et le 5ème est pas numérique, à l'aide array_map() vérifiera toujours les 995 autres valeurs, même si vous connaissez déjà le tableau ne passe pas votre test. Mais si vous utilisez un foreach () au lieu et avoir break sur is_numeric() == false, alors vous aurez seulement besoin de vérifier les cinq premiers éléments.

Vous pouvez utiliser le filtre, mais il finit avec un peu horrible de code

$isAllNumeric = count(array_filter($arr, "is_numeric")) === count($arr)

En utilisant une fonction personnalisée en fait un peu mieux, mais pas encore parfait

$isAllNumeric = count(array_filter($arr, function($x){return !is_numeric($x);})) === 0

Mais si vous utilisez des fonctions personnalisées array_reduce fonctionnerait, mais il a encore quelques défauts.

$isAllNumeric = array_reduce($arr,
                             function($x, $y){ return $x && is_numeric($y); },
                             true);

Les défauts sont qu'il ne se cassera pas quand il a trouvé ce qu'il veut, de sorte que les suggestions ci-dessus ne sont pas fonctionnelles très efficaces. Vous devez écrire une fonction comme ceci:

function array_find(array $array, $callback){
    foreach ($array as $x){ //using iteration as PHP fails at recursion
        if ( call_user_func($callback, array($x)) ){
            return $x;
        }
    }
    return false;
}

Et l'utiliser comme si

$isAllNumeric = array_find($arr, function($x){return !is_numeric($x);})) !== false;

J'ai deux fonctions minuscules mais extrêmement utiles dans ma « bibliothèque standard »

function any($ary, $func) {
   foreach($ary as $val)
      if(call_user_func($func, $val)) return true;
   return false;
}

function all($ary, $func) {
   foreach($ary as $val)
      if(!call_user_func($func, $val)) return false;
   return true;
}

dans votre exemple

 foreach ( $arrays as $arr )
    echo all($arr, 'is_numeric') ? "ok" : "not ok";

Une approche plus élégante à mon humble avis :

foreach ($arrays as $array)
{
 if (array_product(array_map('is_numeric', $array)) == true)
 {
  echo "TRUE\n";
 }

 else
 {
  echo "FALSE\n";
 }
}

Ceci renvoie vrai si toutes les valeurs sont numériques et false si l'une des valeurs est pas numérique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top