如何确定一个数组是否为另一个数组的子集(第一个数组中的所有元素都在第二个数组中出现)?
$s1 = "string1>string2>string3>string4>string5>string6>";
$arr1 = explode(">", $s1);
$s2 = "string1>string4>string5";
$arr2 = explode(">", $s2);
$isSubset = /* ??? */
if (array_intersect($array1, $array2) == $array1) {
// $array1 is a subset of $array2
}
简单:使用数组减法。
通过数组减法,你可以知道一个数组是否是另一个数组的子集。
示例:
if (!array_diff($array1, $array2)) {
// $array1 is a subset of $array2
}
参考: array_diff
你也可以使用array_intersect
。
试试看。
array_diff_assoc
更加安全。 - Tezarray_diff(['a', 'b','c'], ['a', 'b'])
返回 ['c']
,这意味着数组1不是数组2的子集 --> 正确。array_diff(['c'], ['d'])
返回 ['c']
,这意味着数组1不是数组2的子集 --> 正确。有什么问题吗? - alumi strstr($fullString,$subsetStr);
。但是它只适用于所有字符具有相同顺序的情况: 'abcd','cd'
将有效,但'abcd','ad'
则无法正常工作。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;
}
empty
。否则,你就会不必要地放弃 PHP 错误报告的优势。这只是一个经验法则,你应该遵循它,以便通过不抑制错误报告来使自己的生活更轻松。 - decezefunction 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;
array_flip
。 - deceze$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;
}
这是一个简单的函数,如果数组是精确子集,则返回true,否则返回false。该解决方案也适用于二维数组。
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;
}
array_diff
实际上更加优雅。 :) - decezearray_diff
的结果不是一个空数组,那么这个数组就不是另一个数组的子集。如果结果是一个空数组,那么它就是一个子集。所以,你的例子中的结果是预期的、正确的,也正是我们想要的。 - deceze