如果数组2中的任何元素包含数组1中的任何元素,我想删除它。从我的研究中,我发现array_filter可能是一个可以使用的方法,但我对如何做到这一点感到困惑。然后我需要重置数组键。有人能提出一个方法吗?
例如,任何包含"123998"的元素都将从数组2中删除1239986’将不会被删除。
阵列1
Array
(
[0] => 123709
[1] => 123797
[2] => 124089
[3] => 124153
)
阵列2
Array
(
[0] => ../fish/cod/123709-sdfgsdfgvsadfg.pdf
[1] => ../fish/cod/123797-sdfgsdfg-sdfg-sdfgs-dfg-sd.pdf
[2] => ../fish/cod/123998-sdfgsdf-gsdf-gsd-fg-sdfg-.pdf
[3] => ../fish/cod/123998-sdfgsdfg-sdf-gsdfg-sdf-g.pdf
[4] => ../fish/cod/123998-sdfg.pdf
[5] => ../fish/cod/123998-sdfgsdfgsfdg-sdfg.pdf
[6] => ../fish/cod/124089-sdfgsdfg-sdfg-sdfg-.pdf
[7] => ../fish/cod/124153-sdfgsdfgsdf-gsdfg.pdf
)
array_filter
听起来不错,这里有一种使用方法:
$pruned_array = array_filter($array2, function($val2) use ($array1) {
foreach($array1 as $val1) {
if (strpos($val2, val1) !== false)
return $val2;
}
});
如果要检查的值的位置始终相同(或者遵循相同的模式),则仅检查该部分而不是使用strpos
可能更有效。
这是代码
$array1=[...];
$array2=[...];
//go through each element
foreach($array2 AS $key=>$value)
{
//check if element contains substring from first array
foreach($array1 AS $v2)
{
if(strpos($value,$v2)!==FALSE)
{
//remove element
unset($array2[$key]);
//no need to check any further, if element is removed
break;
}
}
}
试试这个
假设u将第一个数组定义为$arr1
,将第二个数组定义为由$arr2
foreach($arr2 as $key => $value)
{
foreach($arr1 as $subkey => $subvalue)
{
if(strpos($subvalue, $value))
unset($arr2[$key]);
}
}
print_r($arr2);
我们可能没有足够的信息来完全理解文件路径数组的可变性,所以我的建议是一般性的。
由于子字符串的黑名单位于文件名的开头,并且必须是一个完整的整数匹配,因此这里有一种方法可以将每个文件路径剥离到其相关组件,并将其与查找数组进行比较,以略微提高性能。
代码:(演示)
$array = [
'../fish/cod/123709-sdfgsdfgvsadfg.pdf',
'../fish/cod/123797-sdfgsdfg-sdfg-sdfgs-dfg-sd.pdf',
'../fish/cod/123998-sdfgsdf-gsdf-gsd-fg-sdfg-.pdf',
'../fish/cod/123998-sdfgsdfg-sdf-gsdfg-sdf-g.pdf',
'../fish/cod/123998-sdfg.pdf',
'../fish/cod/123998-sdfgsdfgsfdg-sdfg.pdf',
'../fish/cod/124089-sdfgsdfg-sdfg-sdfg-.pdf',
'../fish/cod/124153-sdfgsdfgsdf-gsdfg.pdf',
];
$needles = [123709, 123797, 124089, 124153];
$lookup = array_flip($needles);
var_export(
array_filter(
$array,
fn($v) => !key_exists(strstr(basename($v), '-', true), $lookup),
)
);
或者,如果搜索子串可以出现在";干草堆";数组,那么regex的灵活性/实用性可能更合适。我将显示单词边界(b
),因为它适合样本输入,但您也可以在模式的开头使用/
,在模式的末尾使用-
作为";已知的";为任务分隔字符。
代码:(演示)
$regex = '~b(?:' . implode('|', array_map(fn($v) => preg_quote($v, '~'), $needles)) . ')b~';
var_export(preg_grep($regex, $array, PREG_GREP_INVERT));
如果数组2中包含数组1中的任何元素,则使用以下代码删除数组2中的任何元素
$array1 = array('1', '2', '3', '4');
$array2 = array('5', '6', '7', '1');
$temp = array();
foreach ($array2 as $key => $value)
{
// Check the value hasn't already been found:
if (!in_array($value, $array1))
{
//pushing the non duplicate value in temp array
array_push($temp, $value);
}
}
//assign temp array to array2
print_r($array2=$temp);
?>