PHP使用自定义方法实现数组合并示例


Posted in PHP onJuly 07, 2016

本文实例讲述了PHP使用自定义方法实现数组合并。分享给大家供大家参考,具体如下:

在PHP中提供了强大的数组功能,对于数组的合并也提供了两个方法:array_merge 和 array_merge_recursive

但对于我们千变万化的业务来说这些内置的方法并不完全能满足我们的要求

如我现在就遇到了数组合并这方面的问题,要求是这样的:

有两个二维数组,这两个数组大部分的健名是相同的,但有些健名可能并不存在于另一个数组中,现在需要我做的是将第二个数组中所有健值复制到第一个数组中(条件是:两个数组某个健名的值是相同的情况下)

显然内置的两个方法都不能满足要求(两个方法都只是将第二个数组中的健值复制到第一个对应的健上)

$ar1 = array("color"=> array("favorite"=>"red","name"=>"test"));
$ar2 = array("color"=> array("favorite"=>"green","code"=>"code"));
print_r (array_merge ($ar1, $ar2));
print_r(array_merge_recursive ($ar1, $ar2));

可以看到array_merge只是将每个第二个数组的值复制到第一个数组上而已,显然数组一favorite.name被数组二code给覆盖了,而array_merge_recursive不会覆盖掉相同的健名但一旦两个数组健名相同则它会创建一个新数组并将两个数组中值添加到新数组中

以下是我自定义的实现方法:

/**
 * @Author:   HTL
 * @Description: 根据指定的健名将$ar2中的所有健值复制到$ar1对应的健值中
 * @Return:$ar1
 */
 function array_more_merge($ar1,$ar2,$key_name){
  if(
    !$ar1
    || !is_array($ar1)
    || count($ar1)<=0
    || !$ar2
    || !is_array($ar2)
    || count($ar2)<=0
    || !$key_name
    || strlen($key_name)<=0)
  {
    return $ar1;
  }
  /*不能使用for进行循环,因为如果数组中的索引不是连续的则使用for可能无法正确的完成循环
  如 $a =
      Array(
      1 => Array("id" => 1 )
      ,8 => Array("id" => 2 )
      ,4 => Array("id" => 4 )
     );
  该数组数为3所以只能找到[1],而[8][4]在循环中不会进行处理,因为$i <=count($a)不成立<br>*/
  for ($i=0; $i <=count($a) ; $i++) {
      print_r($a[$i]);
  }
  foreach ($ar1 as $i=>$items) {
    foreach ($ar2 as $key=>$item) {
      if($ar2[$key][$key_name]==$ar1[$i][$key_name]){
        $keys = array_keys($ar2[$key]);
        foreach ($keys as $name) {
          $ar1[$i][$name] = $ar2[$key][$name];
        }
      }
    }
  }
  return $ar1;
}
$ar1 = '{"1":{"cost":"1","id":"1","total_price":"5"},"2":{"cost":"2","id":"2","total_price":"10"},"4":{"cost":"4","id":"4","total_price":"20"}}';
$ar1 = json_decode($ar1,true);
$ar2 = '{"1":{"cost":"1","id":"1","total_price":"5"},"2":{"cost":"20","id":"2","total_price":"100"},"4":{"cost":"40","id":"4","total_price":"200"}}';
$ar2 = json_decode($ar2,true);
echo "array_merge_recursive:";
print_r(array_merge_recursive($ar1,$ar2));
echo "array_merge:";
print_r(array_merge($ar1,$ar2));
echo "array_more_merge:";
print_r($this->array_more_merge($ar1,$ar2,"id"));
die();

运行结果如下图所示:

PHP使用自定义方法实现数组合并示例

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
一些使用频率比较高的php函数
Oct 03 PHP
令PHP初学者头疼十四条问题大总结
Nov 12 PHP
PHP 简易输出CSV表格文件的方法详解
Jun 20 PHP
php switch语句多个值匹配同一代码块的实现
Mar 03 PHP
PHP中定义数组常量(array常量)的方法
Nov 17 PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
Nov 19 PHP
PHP实现获取客户端IP并获取IP信息
Mar 17 PHP
PHP实现无限级分类(不使用递归)
Oct 22 PHP
使用phpQuery获取数组的实例
Mar 13 PHP
php语言注释,单行注释和多行注释
Jan 21 PHP
PHP实现与java 通信的插件使用教程
Aug 11 PHP
php libevent 功能与使用方法详解
Mar 04 PHP
PHP记录和读取JSON格式日志文件
Jul 07 #PHP
thinkPHP+PHPExcel实现读取文件日期的方法(含时分秒)
Jul 07 #PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
Jul 07 #PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
Jul 06 #PHP
PHP判断JSON对象是否存在的方法(推荐)
Jul 06 #PHP
PHP通过微信跳转的Code参数获取用户的openid(关键代码)
Jul 06 #PHP
Yii2 RESTful中api的使用及开发实例详解
Jul 06 #PHP
You might like
PHP转换文件夹下所有文件编码的实现代码
2013/06/06 PHP
PHP验证码类ValidateCode解析
2017/01/07 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
JQuery index()方法使用代码
2010/06/02 Javascript
JSON语法五大要素图文介绍
2012/12/04 Javascript
jQuery阻止同类型事件小结
2013/04/19 Javascript
js中onload与onunload的使用示例
2013/08/25 Javascript
js格式化货币数据实现代码
2013/09/04 Javascript
jQuery 中国省市两级联动选择附图
2014/05/14 Javascript
jQuery学习笔记之toArray()
2014/06/09 Javascript
js判断当页面无法回退时关闭网页否则就history.go(-1)
2014/08/07 Javascript
JavaScript实现点击自动选择TextArea文本的方法
2015/07/02 Javascript
Javascript实现单例模式
2016/01/24 Javascript
输入法的回车与消息发送快捷键回车的冲突解决方法
2016/08/09 Javascript
JavaScript基于对象去除数组重复项的方法
2016/10/09 Javascript
微信小程序 五星评分(包括半颗星评分)实例代码
2016/12/14 Javascript
jQuery实现动态文字搜索功能
2017/01/05 Javascript
json2.js 入门教程之使用方法与实例分析
2017/09/14 Javascript
JS构造一个html文本内容成文件流形式发送到后台
2018/07/31 Javascript
浅谈Vue render函数在ElementUi中的应用
2018/09/06 Javascript
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
python执行等待程序直到第二天零点的方法
2015/04/23 Python
Python更新数据库脚本两种方法及对比介绍
2017/07/27 Python
Django REST framework 视图和路由详解
2019/07/19 Python
对Pytorch神经网络初始化kaiming分布详解
2019/08/18 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
2020/02/16 Python
Python 实现进度条的六种方式
2021/01/06 Python
HTML5中使用postMessage实现Ajax跨域请求的方法
2016/04/19 HTML / CSS
德国亚洲食品网上商店:asiafoodland.de
2019/12/28 全球购物
联想C++笔试题
2012/06/13 面试题
英语专业毕业个人求职自荐信
2013/09/21 职场文书
彩色的翅膀教学反思
2014/04/25 职场文书
纪念九一八爱国演讲稿600字
2014/09/14 职场文书
英文辞职信范文
2015/05/13 职场文书
运动会观后感
2015/06/09 职场文书
在职证明书模板
2015/06/15 职场文书