PHP两个二维数组数据做比对,相同的更新,并去除重复,不同的追加!
请求数组数据和原有数据做对比(相同的更新,不同的追加,并去除重复数据)
demo: 现在是请求过来的是,二维数组数据,本地的也是二维数组数据,app的包名是唯一的,通过对比本地原有的数据,把包名,作为数组key,然后去和新来的数据做对比,如果新来数据的已存在,并且版本号大于原有数据,那么此应用版本更新,并且去除重复数据 , 反之(不更新),如果新来数据,不存在,那么两个数组追加,最后返回json数据!
实现方法一
通过遍历去做if判断,简单,执行效率高!
/**
* 接入数据和本地原有数据做对比,返回json更新数据
* @param $requestAppData 上报的app数据
* @param $localAppData 本地已上报过的app数据
* @return json
*/
function returnReportAppsJsonData($requestAppData, $localAppData){
foreach($localAppData as $key => $v){
$localListData[$v['p']]['p']= $v['p'];
$localListData[$v['p']]['v']= $v['v'];
$localListData[$v['p']]['f']= $v['f'];
}
foreach($requestAppData as $key => $val){
$requestAppList[$key]['p'] = $val['p'];
$local_data = $localListData[$val['p']];
//本地的包名 == 请求过来的包名,做版本比较
if ($local_data['p'] == $val['p']) {
if ($local_data['v'] < $val['v']) {
$v = $val['v'];
unset($localListData[$val['p']]);
} else {
$v = $local_data['v'];
unset($localListData[$val['p']]);
}
$requestAppList[$key]['v'] = $v;
$requestAppList[$key]['f'] = $local_data['f'];
} else {
$requestAppList[$key]['v'] = $val['v'];
$requestAppList[$key]['f'] = $val['f'];
}
//包名为空 删掉
if ($val['p'] == "" || empty($val['p'])) {
unset($requestAppList[$key]);
}
}
$mergeData = @array_merge_recursive($localListData, $requestAppList);
$k = 0;
foreach($mergeData as $key2 => $md){
$mergeData2[$k]['p'] = $md['p'];
$mergeData2[$k]['v'] = $md['v'];
$mergeData2[$k]['f'] = $md['f'];
$k++;
}
return json_encode($mergeData2);
}
实现方法二
通过php原有函数,做交集和差级,对比,在拼接,执行效率略慢!
/**
* 接入数据和本地原有数据做对比,返回json更新数据
* @param $requestAppData 上报的app数据
* @param $localAppData 本地已上报过的app数据
* @return json
*/
function returnReportAppsJsonData($requestAppData, $localAppData){
foreach($localAppData as $key => $v){
$localListData[$v['p']]['p']= $v['p'];
$localListData[$v['p']]['v']= $v['v'];
$localListData[$v['p']]['f']= $v['f'];
}
foreach($requestAppData as $key => $val){
$requestAppList[$val['p']]['p']= $val['p'];
$requestAppList[$val['p']]['v']= $val['v'];
$requestAppList[$val['p']]['f']= $val['f'];
}
//交集和本地数据做对比处理
$interData = @array_intersect_assoc($requestAppList, $localListData);
$k = 0;
if ($interData) {
foreach($interData as $ik => $iv){
$ivData[$k]['p'] = $iv['p'];
$ivData[$k]['f'] = $iv['f'];
if ($ik == $localListData[$ik]['p']) {
if ($iv['v']<$localListData[$ik]['v']) {
$v = $localListData[$ik]['v'];
} else {
$v = $iv['v'];
}
$ivData[$k]['v'] = $v;
}
$k++;
}
}else{
$ivData = array();
}
//新增数据和已存在数据-差级处理 & 反比
$dki = 0;
$diffData = @array_diff_assoc($requestAppList, $localListData);
$diffData2 = @array_diff_assoc($localListData, $requestAppList);
if ($diffData || $diffData2) {
$diff_data = @array_merge_recursive($diffData, $diffData2);
foreach($diff_data as $dk => $dv){
$dvData[$dki]['p'] = $dv['p'];
$dvData[$dki]['v'] = $dv['v'];
$dvData[$dki]['f'] = $dv['f'];
$dki++;
}
}else{
$dvData = array();
}
$mergeData = @array_merge_recursive($dvData, $ivData);
// print_r($mergeData);
// die;
return json_encode($mergeData);
}