PHP 二维数组取差集操作方法

作者: admin 分类: php开发 发布时间: 2022-08-28 19:09

一、需求

PHP 中对二维数组取差集操作。

例如:

$arr1 和 $arr2 中我需要 去掉 $arr1 中 和 $arr2 相同的部分。

如下面的两个数组中,最后我需要的是 $arr1 中 ["id"=>102,"name"=>"ptbird","age"=>19];

注明: 其中 id 是在唯一的,也就在任何一个数组中 id 唯一

$arr1=[
  0 => [
    "id" => 100,
    "name" => ptbird,
    "age" => 19
  ], 
  1 => [
    "id" => 101,
    "name" => ptbird,
    "age" => 19
  ], 
  2 => [
    "id" => 102,
    "name" => ptbird,
    "age" => 19
  ], 
];
$arr2=[
  0 => [
    "id" => 100,
    "name" => ptbird,
    "age" => 19
  ], 
  1 => [
    "id" => 101,
    "name" => ptbird,
    "age" => 19
  ], 
  2 => [
    "id" => 104,
    "name" => ptbird2,
    "age" => 19
  ], 
]

二、实现

弄了两个函数:

1、 如果一个数组中没有唯一的id,使用下面这种方式

  • 使用了 in_array()  闭包
  • 注意最后的一个 array_filter() 能够重新索引数组,将空的索引给去掉
    /**
     * 使用in_array()对两个二维数组取差集
     *  - 去除$arr1 中 存在和$arr2相同的部分之后的内容
     * @param $arr1
     * @param $arr2
     * @return array
     */
    function get_diff_array_by_filter($arr1,$arr2){
        try{
            return array_filter($arr1,function($v) use ($arr2){
                return !in_array($v,$arr2);
            });
        }catch (\Exception $exception){
            return $arr1;
        }

    2.如果一个数组中某个key是唯一的,则通过key操作不适用 in_array()

    /**
     * 根据唯一字段对两个二维数组取差集
     *  - 去除$arr1 中 存在和$arr2相同的部分之后的内容
     * - 返回差集数组
     * @param $arr1
     * @param $arr2
     * @param string $pk
     * @return array
     */
    function get_diff_array_by_pk($arr1,$arr2,$pk='pid'){
        try{
            $res=[];
            foreach($arr2 as $item) $tmpArr[$item[$pk]] = $item;
            foreach($arr1 as $v) if(! isset($tmpArr[$v[$pk]])) $res[] = $v;
            return $res;
        }catch (\Exception $exception){
            return $arr1;
        }
    }

     

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

标签云