0

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

5 回答 5

0

这是代码

$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;
        }
    }
}
于 2014-09-03T11:57:01.620 回答
0

是的,array_filter听起来不错,这是一种使用方法:

$pruned_array = array_filter($array2, function($val2) use ($array1) {
  foreach($array1 as $val1) {
    if (strpos($val2, val1) !== false) 
      return $val2;
  }
});

如果要检查的值的位置始终相同(或者如果它遵循相同的模式),则仅检查此部分而不是使用strpos.

于 2014-09-03T11:58:31.047 回答
0

试试这个

假设您将第一个数组定义为$arr1,第二个数组定义为$arr2

foreach($arr2 as $key => $value)
{
   foreach($arr1 as $subkey => $subvalue)
   {
      if(strpos($subvalue, $value))
        unset($arr2[$key]);
   }
}
print_r($arr2);
于 2014-09-03T11:59:28.927 回答
0

我们可能没有足够的信息来完全理解您的文件路径数组的可变性,所以我的建议是笼统的。

由于您的子字符串黑名单出现在文件名的开头并且必须是完整的整数匹配,因此这是一种将每个文件路径剥离到其相关组件并将其与查找数组进行比较以略微提高性能的方法。

代码:(演示

$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),
    )
);

或者,如果搜索子字符串可能出现在“haystack”数组中的不同位置,那么正则表达式的灵活性/实用性可能更合适。我将显示单词边界 ( \b),因为它适合示例输入,但您也可以/在模式的开头和-结尾使用任务的“已知”分隔字符。

代码:(演示

$regex = '~\b(?:' . implode('|', array_map(fn($v) => preg_quote($v, '~'), $needles)) . ')\b~';
var_export(preg_grep($regex, $array, PREG_GREP_INVERT));
于 2022-01-18T23:07:18.163 回答
-1

如果数组 2 中包含数组 1 中的任何元素,则使用下面的代码删除数组 1 中的任何元素,但在此之前,您需要分解数组 2 以获取数字值,例如“123709”

$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);

?>

于 2014-09-03T13:09:52.163 回答