删除与另一个多维数组共享键值对的子数组

时间:2017-11-15 08:04:13

标签: php multidimensional-array filtering array-difference

我有2个数组,如下所示。如果array2拥有array1,我想从stu_id中删除数据。 final数组应该像result_array

$array1 = Array
(
    [0] => Array
        (
            [stu_id] => 1
            [name] => mr.a
        )
    [1] => Array
        (
            [stu_id] => 3
            [name] => mr.b
        )
)

$array2 = Array
(
    [0] => Array
        (
            [id] => 1
            [stu_id] => 1
            [data] => abc
        )
    [1] => Array
        (
            [id] => 2
            [stu_id] => 2
            [data] => xyz
        )
    [3] => Array
        (
            [id] => 3
            [stu_id] => 3
            [data] => aaa
        )
)

$result_array = Array
(
    [0] => Array
        (
            [id] => 2
            [stu_id] => 2
            [data] => xyz
        )
)

我试过了array_diff,$result_array = array_diff($array2, $array1);但它没有用。

请帮我这样做。

2 个答案:

答案 0 :(得分:3)

使用array_column() stud_id临时分配密钥(NULL保留完整的子数组数据),然后使用array_diff_key()进行过滤,array_values()重置密钥键:

代码:(Demo

$array1=[
    ['stu_id'=>1,'name'=>'mr.a'],
    ['stu_id'=>3,'name'=>'mr.b']
];

$array2=[
    ['id'=>1,'stu_id'=>1,'data'=>'abc'],
    ['id'=>2,'stu_id'=>2,'data'=>'xyz'],
    ['id'=>3,'stu_id'=>3,'data'=>'aaa']
];

//var_export(array_column($array1,NULL,'stu_id'));
//var_export(array_column($array2,NULL,'stu_id'));
var_export(array_values(array_diff_key(array_column($array2,NULL,'stu_id'),array_column($array1,NULL,'stu_id'))));

输出:

array (
  0 => 
  array (
    'id' => 2,
    'stu_id' => 2,
    'data' => 'xyz',
  ),
)

如果您想使用foreach循环结构,请从stu_id生成$array1的过滤数组,并对{{1}的每次迭代写一个条件检查}}。此方法不会修改原始数组,因此可以重复使用"向下脚本"。

代码:

$array2

答案 1 :(得分:1)

foreach($array1 as $data1){
    foreach($array2 as $k => $data2){
        if($data2["stu_id"] == $data1["stu_id"]){
            unset($array2[$k]);
            break;
        }
    }
}
$result_array = $array2;