3

要素のcertanシーケンスが配列に存在するかどうかを検出するにはどうすればよいですか?たとえば、アレイと針がある場合

$needle = array(1,1);
$haystack1 = array(0,1,0,0,0,1,1,0,1,0);
$haystack2 = array(0,0,0,0,1,0,1,0,0,1);

サブセット$needleが$haystack1などに存在するかどうかをどのように検出しますか?このメソッドは、$ haystack1の場合はTRUEを返し、$haystack2の場合はFALSEを返す必要があります。

提案をありがとう!

4

3 に答える 3

6

アレイを結合し、針の構造を確認します。

if ( strpos( join($haystack1), join($needle) ) >= 0 ) {
    echo "Items found";
}

デモ:http ://codepad.org/F13DLWOI

警告

これは、haystack配列内のオブジェクトや配列などの複雑なアイテムでは機能しません。この方法は、数値や文字列などのitesmで使用するのが最適です。

于 2012-06-01T15:49:46.647 に答える
3

それらが常に1桁/文字の場合は、すべての要素を文字列に変換し、で結合し''、正規表現または文字列関数を使用して検索できます。

于 2012-06-01T15:49:54.323 に答える
3

配列要素が他の要素のプレフィックスではない特定の場合(両方が文字列に変換される場合)、すでに投稿された回答は正常に機能し、おそらくかなり高速です。

一般的なケースで正しく機能するアプローチは次のとおりです。

function subarray_exists(array $needle, array $haystack) {
    if (count($needle) > count($haystack)) {
        return false;
    }

    $needle = array_values($needle);
    $iterations = count($haystack) - count($needle) + 1;
    for ($i = 0; $i < $iterations; ++$i) {
        if (array_slice($haystack, $i, count($needle)) == $needle) {
            return true;
        }
    }

    return false;
}

実際の動作をご覧ください

免責事項:この関数を作成する方法はいくつかありますが、巨大な干し草の山を検索するときに実行がはるかに速くなると思いますが、最初のアプローチでは単純な方がよいでしょう。

于 2012-06-01T16:02:53.670 に答える