1

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 ループから目的の機能を取得できることを認識しています。

4

5 に答える 5

4

array_map は配列を返します。したがって、常に「真」と見なされます。ここで、array_searchFALSE を選択すると、欲望の効果が得られる可能性があります。

PHP.net ページから

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

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

于 2009-12-16T16:00:10.923 に答える
2

私は通常array_map()array_filter()、 などを強く支持しますが、この場合foreach()は が最良の選択になります。その理由は、array_map()and other を使用すると、何があっても配列全体を通過するためです。しかし、目的のためには、false を返す値に遭遇するまで配列を調べるだけで済みます。is_numeric()私が知る限り、PHP でこれらのメソッドから抜け出す方法はありません。

つまり、配列に 1,000 個の項目があり、5 番目の項目が数値でないarray_map()場合、配列がテストに合格しないことが既にわかっていても、残りの 995 個の値が引き続きチェックされます。しかし、代わりに foreach() を使用してbreakonis_numeric() == falseにすると、最初の 5 つの要素をチェックするだけで済みます。

于 2009-12-16T16:07:20.207 に答える
1

フィルタを使用することもできますが、ひどいコードになってしまいます

$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;
于 2009-12-16T16:03:47.433 に答える
0

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

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

 else
 {
  echo "FALSE\n";
 }
}

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

于 2009-12-16T17:47:13.063 に答える