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 相关文章推荐
简单介绍下 PHP5 中引入的 MYSQLI的用途
Mar 19 PHP
php 分库分表hash算法
Nov 12 PHP
基于simple_html_dom的使用小结
Jul 01 PHP
php生成excel列序号代码实例
Dec 24 PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
Nov 24 PHP
PHP实现支持SSL连接的SMTP邮件发送类
Mar 05 PHP
PHP将进程作为守护进程的方法
Mar 19 PHP
变量在 PHP7 内部的实现(二)
Dec 21 PHP
PHP代码维护,重构变困难的4种原因分析
Jan 25 PHP
你不知道的文件上传漏洞php代码分析
Sep 29 PHP
Windows 下安装 swoole 图文教程(php)
Jun 05 PHP
PHP FileSystem 文件系统常用api整理总结
Jul 12 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
Yii2组件之多图上传插件FileInput的详细使用教程
2016/06/20 PHP
PHP htmlspecialchars()函数用法与实例讲解
2019/03/08 PHP
document.compatMode介绍
2009/05/21 Javascript
jquery如何实现在加载完iframe的内容后再进行操作
2013/09/10 Javascript
简单时间提示DEMO从0开始一直进行计时
2013/11/19 Javascript
使用jQuery判断IE浏览器版本的代码
2014/06/14 Javascript
Bootstrap列表组学习使用
2017/02/09 Javascript
从零开始学习Node.js系列教程五:服务器监听方法示例
2017/04/13 Javascript
React简单介绍
2017/05/24 Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
2017/10/19 Javascript
AngularJS基于MVC的复杂操作实例讲解
2017/12/31 Javascript
js合并两个数组生成合并后的key:value数组
2018/05/09 Javascript
解决Vue中mounted钩子函数获取节点高度出错问题
2018/05/18 Javascript
CKEditor4配置与开发详细中文说明文档
2018/10/08 Javascript
微信小程序在地图选择地址并返回经纬度简单示例
2018/12/03 Javascript
详解JS取出两个数组中的不同或相同元素
2019/03/20 Javascript
vue 设置 input 为不可以编辑的实现方法
2019/09/19 Javascript
javascript设计模式 ? 原型模式原理与应用实例分析
2020/04/10 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
2020/08/03 Javascript
[02:40]2014DOTA2 国际邀请赛中国区预选赛 四大豪门抵达华西村
2014/05/23 DOTA
[22:07]DOTA2-DPC中国联赛 正赛 iG vs Magma 选手采访
2021/03/11 DOTA
进一步了解Python中的XML 工具
2015/04/13 Python
详解python selenium 爬取网易云音乐歌单名
2019/03/28 Python
python实现两个字典合并,两个list合并
2019/12/02 Python
Python datetime模块使用方法小结
2020/06/18 Python
python右对齐的实例方法
2020/07/05 Python
巴黎欧莱雅法国官网:L’Oreal Paris
2019/04/30 全球购物
size?法国官网:英国伦敦的球鞋精品店
2020/03/15 全球购物
工程监理应届生求职信
2013/11/09 职场文书
园林技术个人的自我评价
2014/01/08 职场文书
广告传媒专业应届生求职信
2014/03/01 职场文书
项目合作协议书范本
2014/04/16 职场文书
质量负责人岗位职责
2015/02/15 职场文书
2016年六一文艺汇演开幕词
2016/03/04 职场文书
2016年第104个国际护士节活动总结
2016/04/06 职场文书
yyds什么意思?90后已经听不懂00后讲话了……
2022/02/03 杂记