从一个数组中减去另一个数组

3

Well, I have

$a2 = array('a'=>'Apple','b'=>'bat','c'=>'Cat','d'=>'Dog','e'=>'Eagle','f'=>'Fox','g'=>'God');
$a3 = array('b','e');

我希望从$a2中减去$a3,得到以下结果:
$aNew = array('a'=>'Apple','c'=>'Cat','d'=>'Dog','f'=>'Fox','g'=>'God');

需要帮忙吗?

7个回答

3
有两个内置函数可以做类似的事情:array_diffarray_diff_assoc - 但是在你的情况下,两者都不适用。
所以,要做你想做的事情,你需要稍微更改你的 $a3 标记以适应这些函数(查看文档),或者你需要循环遍历 $a3 并手动从 $a2 中删除元素,像这样:
foreach($a3 as $k){
    unset($a2[$k]);
}

2
foreach($a3 as $value){

   if(isset($a2[$value]))
         unset($a2[$value]);
}

这是更好的方法,就像array_key_exists检查一样。 - Jeremy Roy
这个检查是不必要的,而且会变慢。 - Emmerman
1
无论如何,isset比array_key_exists更好。 - Emmerman
foreach($a3 as $value) isset($a2[$value]) && unset($a2[$value]); 但是,正如我之前所说,这是完全不必要的。 - Emmerman

1

不懂。

$aNew = $a2;
foreach($a3 as $key) unset($aNew[$key]);

你需要这个吗?


谢谢,我以为PHP有一些内置函数。 - Jeremy Roy

1

这可以使用 PHP 内置函数完成。

由于数组 $a2 包含要删除的 的值,因此您需要首先使用 array_flip 创建一个包含 $a2 值作为键的数组。然后,您只需使用 array_diff_key 即可。所以请尝试以下操作:

$aNew = array_diff_key($a2, array_flip($a3));

请注意,您需要使用php> 5.1.0才能使其正常工作。

是吗?我认为内置函数非常快。不过如果只有几个元素的话,速度应该不会有太大影响。 - vidstige
只是在我的本地计算机上进行测试,以确保-使用“flip”进行100k次迭代大约需要0.56秒,而使用“foreach”则需要0.46秒。 - Emmerman

0
$aNew = array();
foreach (array_diff(array_keys($a2), $a3) : $key) {
   $aNew[key] = $a2[key];
}

这应该能完成工作。从a2获取键,删除在a3中存在的所有键,然后将剩余的键复制到一个新的数组中。您也可以从旧数组中删除这些键。这取决于您。
编辑:+$

0

这里的难点在于你需要将一个数组的与另一个数组的进行比较。例如,可以使用array_diff_ukey函数。 来自PHP手册的摘录:

  function key_compare_func($key1, $key2)
  {
     if ($key1 == $key2)
       return 0;
     else if ($key1 > $key2)
       return 1;
    else
       return -1;

}

$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4); $array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8);

使用var_dump(array_diff_ukey($array1, $array2, 'key_compare_func'));

输出结果为:

array(2) { ["red"]=> int(2) ["purple"]=> int(4) }

由于第二个数组不是关联数组,所以会将“a”与0进行比较。因此结果如上。

$compareFunc = function($key) uses ($a3) {
 if(array_key_exists($key, $a3) {
    return true;
 }
 else return false;
}

array_map($compareFunc, $a2);

不能使用,因为此函数用于修改而非减少数组。

$a4 = array();
$compareFunc = function($key) uses ($a3, &$a4) {
 if(array_key_exists($key, $a3) {
    array_push($a4);
 }
} 

能够完成工作。
我想要实现的是: 尝试使用PHP中提供回调函数的功能,当标准函数不成功时。 当回调函数的描述不符合您的需求时,尝试使用绑定概念。使用PHP的Lambda函数,您可以将对象/变量绑定到函数上, 以便您可以访问未传递给回调函数的变量。 发挥创造力!!!


-2

尝试使用array_diff,但你需要对$a3进行一些更改。

$a3 = array('bat', 'Eagle');
//and then
$a4 = array_diff($a2, $3);

因为如果没有指定键(使用键=>值的格式),该字符串将自动成为一个值。


如果您无法更改输入数组(例如来自外部的数组),那么这不是一个好主意。 - Emmerman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接