【问题标题】:Removing subarrays that share a key-value pair with another multidimensional array删除与另一个多维数组共享键值对的子数组
【发布时间】:2018-04-28 08:54:54
【问题描述】:

我有 2 个数组,如下所示。如果array1 具有stu_id,我想从array2 中删除数据。最终数组应类似于 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);,但它不起作用。

请帮我做这件事。

【问题讨论】:

  • array_diff、array_column、array_filter - 了解函数

标签: php multidimensional-array filtering array-difference


【解决方案1】:
foreach($array1 as $data1){
    foreach($array2 as $k => $data2){
        if($data2["stu_id"] == $data1["stu_id"]){
            unset($array2[$k]);
            break;
        }
    }
}
$result_array = $array2;

【讨论】:

  • 您需要使用array_values() 重置结果中的键。
  • 仍然保留原始的$array2 密钥。只需将array_values () 添加到$result_array 声明即可。
【解决方案2】:

使用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 循环结构,请从 $array1 生成 stu_id 的过滤数组,并对 $array2 的每次迭代编写条件检查。此方法不会修改原始数组,因此可以“向下脚本”重复使用。

代码:

$stu_ids=array_column($array1,'stu_id');
foreach($array2 as $row){
    if(!in_array($row['stu_id'],$stu_ids)){
        $result[]=$row;  // auto-index the qualifying subarrays
    }
}
var_export($result);
// same result as above method

【讨论】:

  • @tenten 这个答案满足还是我需要进一步解释?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多