Как я могу определить, является ли один массив подмножеством другого (все элементы в первом входят во второй)?
$s1 = "string1>string2>string3>string4>string5>string6>"; $arr1 = explode(">", $s1); $s2 = "string1>string4>string5"; $arr2 = explode(">", $s2); $isSubset = /* ??? */
Если вы начинаете с строк, вы можете проверить strstr($fullString,$subsetStr);
, Но это будет работать только тогда, когда все символы имеют одинаковый порядок: 'abcd','cd'
будет работать, но 'abcd','ad'
не будет.
Но вместо того, чтобы писать свою собственную, настраиваемую функцию, вы должны знать, что PHP имеет TONS из функций массива, поэтому его ряды невозможно, что нет функции 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; }
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
.
Я бы создал связанный массив большего массива, а затем итерацию через меньший массив, ища не столкновение, если вы его найдете, верните 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;
$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; }
,$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, если массив является точным подмножеством, в противном случае ложным. Решение применимо и для двухмерного массива.
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; }