質問

は、配列の値をテストするために()array_mapを使用することはできますか?私は、配列のすべての要素が数値であることを確認します。

私は両方の

を試してみました
$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";
        }
}

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

そして、私が得る両方のための

TRUE
TRUE

これは行うことができますか?もしそうなら、私は間違って何をやってんだ?

注:私は、foreachループから私の所望の機能性を得ることができることを承知しています。

役に立ちましたか?

解決

array_mapを、配列を返します。だから、常に「真」とみなされます。あなたがFALSEのためarray_searchさて、もし、あなたが望む効果を得ることができるかもしれません。

PHP.netページ

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

これは、現在、あなたが各要素に対して真または偽含む配列を有することを意味します。あなたは虚偽の値があるかどうかを調べるためにarray_search(false,$array)を使用する必要があります。

他のヒント

私は通常などarray_map()array_filter()の大きな提唱者だが、この場合にはforeach()は最良の選択になるだろう。その理由は、array_map()と他の人とそれがどんな配列全体を通過していないということです。しかし、あなたの目的のためにあなただけがis_numeric()がfalseを返すの値に実行し、私の知る限り、これらの方法から抜け出すためのPHPでの方法はありませんまで、アレイを通過する必要があります。

あなたは配列の千個のアイテムを持っており、第五1が数値でない場合は、

つまり、array_map()を使用すると、まだあなたはすでにあなたのテストに合格しない配列を知っているにもかかわらず、残りの995個の値をチェックします。あなたの代わりに)(foreachのを使用して、それがbreakis_numeric() == false持っている場合しかし、その後、あなただけのこれらの最初の5つの要素をチェックする必要があります。

あなたは、フィルタを使用することができますが、それは、コードの恐ろしいビット

で終了します
$isAllNumeric = count(array_filter($arr, "is_numeric")) === count($arr)

カスタム関数を使用すると、

それは少し良くなりますが、まだ完璧ではありません
$isAllNumeric = count(array_filter($arr, function($x){return !is_numeric($x);})) === 0
カスタム関数を使用していた場合は、

しかし、array_reduceが働くだろうが、それはまだいくつかの欠点があります。

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

の欠点は、それが望んでいるものを見つけたとき、それは壊れないことがあるので、上記の機能の提案は非常に効率的ではありません。あなたはこのように関数を記述する必要があります:

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

そしてそうのようにそれを使用する

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

私は私の「標準ライブラリ」に2つの小さなが、非常に便利な機能を持っている。

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

あなたの例では、

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

よりエレガントなアプローチ私見

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

 else
 {
  echo "FALSE\n";
 }
}

の値のいずれかが数値でない場合は、すべての値が数値と偽である場合、これはtrueを返します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top