假设我们有两个数组:
$a=array('1'=>'Apple','2'=>'Microsoft',
'3'=>'Microapple','4'=>'Applesoft','5'=>'Softapple');
$b=array(1,3);
其中$ b数组表示要区分的数组$ a的键。
我们希望收到另一个带有以下值的数组$ c:
$c=array('2'=>'Microsoft','4'=>'Applesoft','5'=>'Softapple');
在php手册中有两个功能:
array_diff($array1,$array2); //difference of values
array_diff_key($array1,$array2);//difference of keys
但以上都不适用于此。
我们该怎么做?
修改
感谢大家的贡献。
我在预定义的两个阵列上执行了一些基准测试,如下所示:
for ($i=0; $i < 10000; $i++) { //add 10000 values
$a[]=mt_rand(0, 1000000); //just some random number as a value
}
for ($i=0; $i < 10000; $i++) { //add 10000 values as keys of a
$b[]=mt_rand(0, 1000);
} //randomly from 0 to 1000 (eg does not cover all the range of keys)
每次测试也进行了10000次,Nanne
解决方案的平均时间为:
0.013398
decereé
:
0.014865
哪个也很棒。
...与in_array()的其他建议不同但是(答案被删除):
foreach ($a as $key => $value)
if (!in_array($key, $b))
$c[$key] = $value;
上述情况平均为2秒。由于显而易见的原因,in_array()必须循环遍历$ b以检查该值是否存在。以上是not
如何做到这一点的一个很好的例子! : - )
答案 0 :(得分:10)
$c = array_diff_key($a, array_flip($b));
答案 1 :(得分:3)
我只想编码:
$c = $a;
foreach ($b as $removeKey) {
unset($c[$removeKey]);
}
答案 2 :(得分:0)
您的数组$ b未设置数组键,您正在设置值。
如果您要使用:
$a=array('1'=>'Apple','2'=>'Microsoft',
'3'=>'Microapple','4'=>'Applesoft','5'=>'Softapple');
$b=array('1' => NULL ,'3' => NULL);
array_diff_key($a,$b)
你会得到你预测的结果。