转眼就三月了,好久没写博客的感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
循环比较也行
我还记得上次那个蛇皮数组 😆
@赟鹏 😕 得瑟