两个二维数组数据做比对,相同的更新,并去除重复,不同的追加!

作者: Kevin 分类: php学习,小知识汇总 发布时间: 2016-03-07 11:01
<strong>请求数组数据和原有数据做对比(相同的更新,不同的追加,并去除重复数据)</strong>
<span style="color: #ff0000;">demo: 现在是请求过来的是,二维数组数据,本地的也是二维数组数据,app的包名是唯一的,通过对比本地原有的数据,把包名,作为数组key,然后去和新来的数据做对比,如果新来数据的已存在,并且版本号大于原有数据,那么此应用版本更新</span>
<span style="color: #ff0000;">,并且去除重复数据 , 反之(不更新),如果新来数据,不存在,那么两个数组追加,最后返回json数据
</span>

实现方法一:通过遍历去做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);
}

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

5条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

− 1 = 2