测试一个数组是否是另一个数组的子集

Kam*_*ngi 12 php arrays set

如何确定一个数组是否是另一个数组的子集(第一个数组中的所有元素都存在于第二个数组中)?

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

 $isSubset = /* ??? */
Run Code Online (Sandbox Code Playgroud)

dec*_*eze 53

if (array_intersect($array1, $array2) == $array1) {
    // $array1 is a subset of $array2
}
Run Code Online (Sandbox Code Playgroud)

  • @Tamas嗯,不,`array_diff`实际上更优雅.:) (2认同)
  • @aleemb 好吧...如果`array_diff` 结果不是空数组,则该数组***不是***另一个的子集。如果结果是一个空数组,则它是一个子集。因此,您示例中的结果是预期的且正确的,并且正是我们想要的。 (2认同)

sha*_*ail 17

简单:使用数组减法.

在数组减法中,您将知道一个数组是否是另一个数组的子集.

例:

if (!array_diff($array1, $array2)) {
    // $array1 is a subset of $array2
}
Run Code Online (Sandbox Code Playgroud)

参考:array_diff

你也可以用array_intersect.

  • @aleemb我看不出你的意思。对于此解决方案:`array_diff(['a','b','c'],['a','b'])`返回`['c']`,这意味着array1不是array2的子集- ->正确。array_diff(['c'],['d'])`返回`['c']`,这意味着array1不是array2的子集->正确。怎么了? (2认同)

Eli*_*gem 17

如果你从字符串开始,你可以检查strstr($fullString,$subsetStr);.但是,只有当所有角色都具有相同的顺序时'abcd','cd'才会起作用:会起作用,但'abcd','ad'不起作用.

但是,而不是写你自己的自定义,功能,你应该知道,PHP有的阵列功能,所以它的嘶鸣上不可能没有一个std功能,可以做你需要它做什么.在这种情况下,我建议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;
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,但正如它所说:这里没有真正的区别:`empty` ===与`false'的松散比较,所以`empty($ var)`和`!$ var`是可以互换的.AFAIK的唯一好处是`!$ var`在未定义`$ var`时抛出错误.这在上面的代码段中是不可能的.不过,我会编辑我的答案,以防万一有人因为某种原因决定在`array_diff`和`if()之间添加多行代码. (3认同)
  • 我不介意被投票,但我记得人们不愿意解释_why_ (3认同)
  • 好吧,确切地说.你应该只对*可能合法不存在*的变量使用`empty`.否则,您将不必要地超越PHP错误报告的优势.这只是一个经验法则,你应该遵循这一规则,通过不抑制错误报告来让自己的生活更轻松. (2认同)