test değerleri array_map kullanıyor?

5 Cevap php

O () Bir dizinin değerlerini test etmek için array_map kullanmak mümkün mü? Ben bir dizinin tüm unsurları sayısal olduğundan emin olmak istiyorum.

Ben hem denedim

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

ve

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

Ve her ikisi için alıyorum

TRUE
TRUE

Bu yapılabilir mi? Eğer öyleyse, ben yanlış ne yapıyorum?

Not: Ben bir foreach döngü benim istenen işlevselliği alabilirsiniz farkında değilim.

5 Cevap

array_map bir dizi döndürür. Bu yüzden her zaman 'gerçek' olarak kabul edilecektir. Eğer array_search FALSE Şimdi, eğer, siz arzu etkileri elde etmek mümkün olabilir.

PHP.net Page Gönderen

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

Bu şu anda doğru veya her öğe için yanlış içeren bir dizi var demektir. Herhangi bir yanlış değer varsa array_search(false,$array) bulmak için kullanmak gerekir.

Ben genellikle array_map(), array_filter(), vb büyük bir savunucusu değilim, ama bu durumda foreach() en iyi seçim olacak. Neden array_map() ve diğerleri ile ne olursa olsun tüm dizi boyunca devam edecek olmasıdır. Ama amaçları için sadece size is_numeric() false döndürür, ve bildiğim kadarıyla bu yöntemleri patlak PHP yolu yoktur kendisi için bir değer haline çalıştırmak kadar dizi üzerinden gitmek gerekir.

Eğer dizideki 1.000 ürün var ve 5. biri zaten diziyi biliyor olsa bile array_map() hala kalan 995 değerleri kontrol edecek kullanılarak, sayısal değilse, diğer bir deyişle, test geçmek değildir. Eğer yerine foreach () kullanın ve varsa Ama break üzerine is_numeric() == false, o zaman sadece bu ilk beş unsurları kontrol etmek gerekir.

Sen filtre kullanabilirsiniz, ancak bu kod korkunç bir bit ile biter

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

Özel bir işlevi kullanarak biraz daha iyi yapar, ama hala mükemmel değil

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

Özel fonksiyonları kullanarak Ama eğer array_reduce çalışacak, ancak hala bazı başarısızlıkları vardır.

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

Başarısızlıkları o istediğini bulduğunda onu kırmak olmaz, bu nedenle fonksiyonel önerileri üzerinde çok etkili değildir. Böyle bir işlevi yazmak gerekir:

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

Ve böylece gibi kullanın

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

benim "standart kitaplığındaki" iki küçük ama son derece yararlı fonksiyonlara sahip

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

Sizin örnekte

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

A more elegant approach IMHO:

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

 else
 {
  echo "FALSE\n";
 }
}

Değerlerinden herhangi bir sayısal değilse, bütün değerleri sayısal ve yanlış varsa bu doğru dönecektir.