PHP怎么获取二维数组之间的差值

转眼就三月了,好久没写博客的感jio 😀

PHP对于数组的相关操作,可以说是封装的很完善了,基本上都有函数

前几天写了一个获取思否某标签下文章的采集Api,为了不想重复推送,就加了一个新旧文件比较的操作,其实就是两个数组合并取差值

结果想都没想,直接用了函数

array_unique(array_merge($a, $b));

意思是合并两个数组,然后移除数组中重复的值,挂了一天后发现有点问题,有多个文章的时候,只推送一条

看一下文档,发现当几个数组元素的值相等时,array_unique()只保留第一个元素,其他的元素被删除

所以就不能这么写,简单写个demo

$arr1 = [
    0 => [
        'title' => 'test0',
        'url' => 'http://qq52o.me/110.html',
    ],
    1 => [
        'title' => 'test1',
        'url' => 'http://qq52o.me/111.html',
    ],
    2 => [
        'title' => 'test2',
        'url' => 'http://qq52o.me/112.html',
    ],
];

$arr2 = [
    0 => [
        'title' => 'test0',
        'url' => 'http://qq52o.me/110.html',
    ],
    1 => [
        'title' => 'test1',
        'url' => 'http://qq52o.me/111.html',
    ],
    2 => [
        'title' => 'test2',
        'url' => 'http://qq52o.me/112.html',
    ],
    3 => [
        'title' => 'test3',
        'url' => 'http://qq52o.me/113.html',
    ],
];

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

也就是我需要得到['title' => 'test3','url' => 'http://qq52o.me/113.html']

两个数组中title是唯一的,所以通过key操作不适用in_array()

直接上函数吧

function getDiffArrayByPk($arr1, $arr2, $pk='title')
{
    $res = [];
    foreach($arr2 as $item) {
        $tmpArr[$item[$pk]] = $item;
    }
    foreach($arr1 as $v) {
        if(!isset($tmpArr[$v[$pk]])) {
            $res[] = $v;
        }
    }
    return $res;
}

当没有唯一id的时候,可以使用in_array()

function getDiffArrayByFilter($arr1, $arr2)
{
    return array_filter(
        $arr1, function ($v) use ($arr2) {
            return !in_array($v, $arr2);
        }
    );
}

当然你用两层foreach循环比较也行

2 条评论

发表评论

*