2016-10-05 5 views
8

のPHP当量があり、我々は行うことができます。はJavaScriptでのJavaScriptのArray.prototype.some()関数

function isBiggerThan10(element, index, array) { 
    return element > 10; 
} 
[2, 5, 8, 1, 4].some(isBiggerThan10); // false 
[12, 5, 8, 1, 4].some(isBiggerThan10); // true 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some

は、いくつかの()関数のPHPと同等はありますか?

+0

HMは除いて、ルックス一致する要素も返す – mech

答えて

8

いいえ、PHP標準ライブラリで同等の一切短絡はありません。 array_reduceはおそらく最高のフィットでしょうそのうち非短絡ソリューション、任意の数があります。

var_dump(array_reduce([2, 5, 8, 1, 4], function ($isBigger, $num) { 
    return $isBigger || $num > 10; 
})); 

それはあなた自身のsome/any/all機能を実現する価値がある、または機能のコレクションを提供するライブラリを使用することができますこのようなプログラミングプリミティブ、例えばhttps://github.com/lstrojny/functional-php

+2

これは、array_filterソリューションとほとんど同じ性能を持ちます(ただし、メモリ使用率は向上します)。 – GordonM

-3

array_filterを使用してコールバックを提供します。どんな結果

function array_some(array $data, callable $callback) { 
    $result = array_filter($data, $callback); 
    return count($result) > 0; 
} 

$myarray = [2, 5, 8, 12, 4]; 
array_some($myarray, function($value) { 
    return $value > 10; 
}); // true 
+2

array_filterは配列を返してすぐに破棄するので、これは考えましたが、少し非効率かもしれないと思った – Rory

+2

これは短絡していません。非効率的な。 – deceze

+1

あなたが既に試したことを述べていないので、あなたの質問を修正することをお勧めします。これは、これを行うことができるネイティブ関数がないので、最善の解決策です。それ以外の唯一の方法は、反復して各値をチェックすることです。できるだけ早く真を返します。 –

0

が与えられたコールバックの戻り値に基づいて指定された配列のサブセットを返しarray_filter()は、ありますが存在するかどうかをカウントするために別の関数でこれを包みます。サブセットが空の場合、Some()はfalseを返し、それが空でない場合、Some()はtrueを返します。

$unfiltered = [1, 11, 2, 22, 3, 33, 4, 44, 5, 55]; 
$filtered = array_filter ($unfiltered, function ($elem){ 
    return $elem > 10; 
}); 

print_r ($unfiltered); 
print_r ($filtered); 
var_dump (empty ($filtered)); 

このアプローチは短絡しませんが、パフォーマンスはアレイのサイズに反比例します。しかし、これは現実の世界では重要ではありません。なぜなら、配列がかなり巨大にならなければならないか、array_filterが何度も呼び出されてからパフォーマンスに影響を及ぼすことに気付くからです。

パフォーマンスが重要な場合は、自分でループをループし、一致するとすぐにループから抜け出す必要があります。

$biggerThanTen = false; 
foreach ($unfiltered as $elem) 
{ 
    if ($elem > 10) 
    { 
     $biggerThanTen = true; 
     break; 
    } 
} 
7

これは含まれていませんが、簡単に作成できます。これはSRFI-1名前anyevery使用していますが、someall名前を変更することができます。http://php.net/manual/en/function.array-filter.phpは興味がある可能性が似

function array_any(array $array, callable $fn) { 
    foreach ($array as $value) { 
     if($fn($value)) { 
      return true; 
     } 
    } 
    return false; 
} 

function array_every(array $array, callable $fn) { 
    foreach ($array as $valu) { 
     if(!$fn($value)) { 
      return false; 
     } 
    } 
    return true; 
} 
+0

関数array_every($ a、$ c)を持つ方が高速かもしれません{return array_filter($ a、function($ b)use($ c){return!$ c($ b);})== $ a; } ' – cwallenpoole