20

ある配列が別の配列のサブセットであるかどうかを判断するにはどうすればよいですか (最初の配列のすべての要素が 2 番目の配列に存在します)。

 $s1 = "string1>string2>string3>string4>string5>string6>";
 $arr1 = explode(">", $s1);
 $s2 = "string1>string4>string5";
 $arr2 = explode(">", $s2);

 $isSubset = /* ??? */
4

6 に答える 6

64
if (array_intersect($array1, $array2) == $array1) {
    // $array1 is a subset of $array2
}
于 2012-09-05T07:36:18.703 に答える
24

簡単: 配列減算を使用します。

配列の減算では、1 つの配列が他の配列のサブセットであるかどうかがわかります。

例:

if (!array_diff($array1, $array2)) {
    // $array1 is a subset of $array2
}

参考:array_diff

も使えますarray_intersect

于 2012-09-05T07:39:03.863 に答える
20

文字列から開始する場合は、strstr($fullString,$subsetStr);. ただし、すべての文字の順序が同じ場合にのみ機能します。機能しますが、'abcd','cd'機能し'abcd','ad'ません。

しかし、独自のカスタム関数を作成する代わりに、PHP には大量の配列関数があることを知っておく必要があります。この場合、次のことをお勧めしarray_diffます。

$srcString = explode('>','string1>string2>string3>string4>string5');
$subset = explode('>','string3>string2>string5');
$isSubset = array_diff($subset,$srcString);
//if (empty($isSubset)) --> cf comments: somewhat safer branch:
if (!$isSubset)
{
    echo 'Subset';
    return true;
}
else
{
    echo 'Nope, substrings: '.implode(', ',$isSubset).' Didn\'t match';
    return false;
}
于 2012-09-05T07:50:53.573 に答える
1

大きい方の配列に関連付けられた配列を作成し、小さい方の配列を繰り返し処理して、衝突がないことを探します。見つかった場合は false を返します。

function isSubset($arr1,$arr2){
    $map = Array();
    for ($i=0;$i<count($arr1);$i++){
      $map[$arr[$i]]=true;
    }
    for ($i=0;$i<count($arr2);$i++){
       if (!isset($map[$arr2[$i]])){
          return false;
       }
    }
    return true;
于 2012-09-05T07:34:36.707 に答える
1
$s1 = "1>2>3>4>5>6>7";

$arr1 = explode(">",$s1);

$s2 = "1>2>3";

$arr2 = explode(">",$s2); 

if(isSub($arr1,$arr2)){

         echo 'true';

}else{

         echo 'false';
}

function isSub($a1,$a2){

    $num2 = count($a2);
    $sub  = $num2;

    for($i = 0;$i < $num2 ;$i++){
        if(in_array($a2[$i],$a1)){
            $sub--;
        }
    }
    return ($sub==0)? true:false;
}
于 2012-09-05T08:48:42.907 に答える
0

配列が正確なサブセットである場合に true を返す単純な関数で、そうでない場合は false を返します。ソリューションは、2 次元配列にも適用できます。

 function is_array_subset($superArr, $subArr) {
        foreach ($subArr as $key => $value) {
            //check if keys not set in super array OR values are unequal in both array.
            if (!isset($superArr[$key]) || $superArr[$key] != $value) {
                return false;
            }
        }
        return true;
    }
于 2016-02-11T14:22:42.147 に答える