如果值包含在列入黑名单的id数组中找到的id子字符串,则筛选文件路径数组



如果数组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);

?>

最新更新