1

カンマ区切りの文字列に別のカンマ区切りの文字列が含まれているかどうかを確認するのに問題があります。

2つの文字列があるとします

$stringA="red,blue,yellow,green,black,grey,purple,pink,khaki,lemon,orange,white,maroon";
$stringB="blue,green,white,pink,maroon";

確認したいのは、の色$stringBが含まれているかどうかだけですか$stringA?私が考えることができる唯一の方法は$stringA、配列に変換し、関数を使用して色を1つずつチェックすることin_arrayです。別の簡単な方法はありますか?

前もって感謝します

4

3 に答える 3

2

配列を比較することは悪い考えではないと思いますが、次のようなこともできます。

$stringATmp = ','.$stringA.',';
$colors = explode(',', $stringB);
$contains = true;
foreach ($colors as $color) {
    if (strpos($stringATmp, ','.$color.',') === false) {
        $contains = false;
        break;
    }
}
于 2013-01-07T16:50:50.493 に答える
2
$stringA="red,blue,yellow,green,black,grey,purple,pink,khaki,lemon,orange,white,maroon";
$stringB="blue,green,white,pink,maroon";

$arrayA = explode(',', $stringA);
$arrayB = explode(',', $stringB);

$min = min(array(
    count($arrayA),
    count($arrayB),
));

$AcontainsB = ($min == count(array_intersect($arrayA, $arrayB)));
于 2013-01-07T17:00:52.587 に答える
1

他の方法よりも高速な方法はありますが、ある種のデータ構造にデータをロードするよりも概念的に簡単な方法はありません。任意の順序でアイテムのリストを任意の順序である可能性のある別のアイテムのリストと照合することについて話しているので、参照リスト(stringA)をデータ構造に取り込み、stringBリストを検索する方法はありません。そのデータ構造。

それをスピードアップする1つの方法。

  1. stringAを配列に分解します。
  2. arrayはstringA配列を反転して、色が配列のキーになるようにします(値が何であるかは関係ありません)。
  3. これで、次のようなコードを使用して、展開された文字列Bから各色を検索できます。

このようなもの:


$stringAArray = explode(',', $stringA);
$stringAArray = array_flip($stringAArray);
$stringBArray = explode(',',$stringB);
$itemsToFind = count($stringBArray);
foreach ($stringBArray as $colorFromB) {
    if (array_key_exists($colorFromB, $stringAArray)) {
        $itemsToFind--;
    }
}
if ($itemsToFind == 0) {
    echo "All B items are in A"
}

これは非常に高速なルックアップであり、AとBの多くのアイテムに対して適切にスケーリングします。

最後の注意:小さいアレイの場合、経由で実行in_arrayすると比較的高速になります。

于 2013-01-07T16:51:18.887 に答える