Frage

Ist es möglich, (), um Testwerte eines Arrays zu verwenden array_map? Ich möchte sicherstellen, dass alle Elemente eines Arrays numerisch sind.

Ich habe versucht, beide

$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";
        }
}

und

$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";
        }
}

Und für beide ich

TRUE
TRUE

Kann dies geschehen? Wenn ja, was mache ich falsch?

. Hinweis: Ich bin mir bewusst, dass ich meine gewünschte Funktionalität aus einer foreach-Schleife bekommen

War es hilfreich?

Lösung

array_map ein Array zurückgibt. So wird es immer ‚wahr‘ in Betracht gezogen werden. Nun, wenn Sie für FALSCH array_search, könnten Sie in der Lage sein, die Lust Effekte zu erhalten.

Von der PHP.net Seite

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

Das bedeutet, dass derzeit ein Array haben, die für jedes Element wahr oder falsch enthält. Sie müßten array_search(false,$array) verwenden, um herauszufinden, ob es irgendwelche falschen Werte sind.

Andere Tipps

Ich bin normalerweise ein großer Verfechter von array_map(), array_filter(), etc., aber in diesem Fall foreach() wird die beste Wahl sein. Der Grund dafür ist, dass mit array_map() und anderen ist es durch das gesamte Feld gehen, egal was. Aber für Ihre Zwecke benötigen Sie nur durch das Feld gehen, bis Sie in einen Wert laufen, für die is_numeric() false zurück, und soweit ich weiß, dass es in PHP keine Möglichkeit dieser Methoden auszubrechen.

Mit anderen Worten, wenn Sie 1000 Artikel im Array und die fünfte ist nicht numerisch, array_map() verwendet, wird noch die restlichen 995 Werte überprüfen, obwohl Sie bereits das Array wissen nicht Ihren Test. Aber wenn Sie ein foreach () statt und haben es auf break is_numeric() == false, dann werden Sie nur die ersten fünf Elemente müssen überprüfen.

Sie könnten nutzen Filter, aber es endet mit einem schrecklichen Stück Code up

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

eine benutzerdefinierte Funktion macht es ein bisschen besser, aber noch nicht perfekt

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

Aber wenn Sie benutzerdefinierte Funktionen wurden mit array_reduce funktionieren würde, aber es hat noch einige Mängel.

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

Die Mängel sind, dass sie nicht bricht, wenn es gefunden hat, was es will, so die funktionellen obigen Vorschläge sind nicht sehr effizient. Sie müssten eine Funktion wie folgt schreiben:

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;
}

Und verwenden Sie es wie so

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

ich habe zwei kleine, aber sehr nützliche Funktionen in meiner „Standardbibliothek“

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;
}

in Ihrem Beispiel

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

Ein eleganter Ansatz IMHO :

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

 else
 {
  echo "FALSE\n";
 }
}

Dies wird return true, wenn alle Werte sind numerisch und falsch, wenn einer der Werte nicht numerisch ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top