php二维数组用键名分组相加实例函数


Posted in PHP onNovember 06, 2013

本文介绍一篇关于php 二维数组以某一键名进行分组相加的实例程序,如果是从数据库里取数据的时候大可以SELECT SUM(t_value),t_id FROM t_table GROUP BY t_id,但是如果是在php程序中处理类似的问题就稍微麻烦点了,这里给个函数就是处理类似的问题

<?php 
/* 函数功能:对二维数组以某一键名进行分组相加,返回新的二维数组 
 * 参数说明:$arr-源数组;$new_arr-相加后得到的新数组;$target_key-要分组的键名 
 */
function add_array($arr, &$new_arr, $target_key) { 
    $num = count($new_arr); //计算新数组的大小,新数组也是二维的,这里计算的是第一维 
    for ($i = 0; $i < $num; $i++) { 
        //循环新数组 
        //if块主要判断当前分组的键名是否已经存在于新数组中,避免重复 
        //由于该函数是被循环调用的,而新数组可能有多于1个的元素,所以必须对新数组中的每一个元素都进行比较, 
        //新数组的元素是一个一维数组,$i动态的比较新的二维数组中的分组键名 
        if ($arr[$target_key] != $new_arr[$i][$target_key]) {//判断新数组中的分组键名是否跟当前源数组中的分组键名相等 
            $cmp_num++; //如果不相等,比较次数自增1 
        } else {//如果相等,说明当前分组键名已经存在 
            $tar_exist = true; //设置存在标识为true 
            $tar_key = $i; //返回当前分组键名在新数组中的数字索引 
            break; //跳出循环 
        } 
    } 
    //如果比较次数跟新数组大小一样,说明当前分组键名不在新数组中,设置存在标识为false 
    if ($cmp_num == $num) 
        $tar_exist = false; 
    if ($tar_exist) {//如果分组键名已经存在,对该分组的数组元素进行相加 
        foreach ($arr as $key => $value) { 
            if ($key != $target_key) {//分组键名对应的元素值不相加 
                $new_arr[$tar_key][$key]+=$value; //其余的元素值进行相加 
            } 
        } 
    } else { 
        //如果分组键名不存在 
        //设置新的分组键名,并对该分组的数组元素进行相加 
        //新数组的第一维使用$num参数来分辨当前分组的秩序 
        //由于$num实际上就是新数组中,按键名分组的个数,并且是从0开始,所以新的分组在新数组中的索引直接用$num即可, 
        //而不须要$num+1 
        $new_arr[$num][$target_key] = $arr[$target_key]; 
        foreach ($arr as $key => $value) { 
            if ($key != $target_key) {//分组键名对应的元素值不相加 
                $new_arr[$num][$key]+=$value; //其余的元素值进行相加 
            } 
        } 
    } 
} 
$arr = array( 
    array('group_id' => 13, 'team_price' => 88.00, 'satopay_price' => 85.00, 'team_id' => 348, 'origin' => 440, 'gain' => 14.45, 'quantity' => 5), 
    array('group_id' => 13, 'team_price' => 12.00, 'satopay_price' => 11.00, 'team_id' => 344, 'origin' => 36, 'gain' => 2.76, 'quantity' => 3), 
    array('group_id' => 14, 'team_price' => 4.99, 'satopay_price' => 4.60, 'team_id' => 335, 'origin' => 4.99, 'gain' => 0.31915, 'quantity' => 1), 
    array('group_id' => 14, 'team_price' => 12.00, 'satopay_price' => 11.00, 'team_id' => 344, 'origin' => 24, 'gain' => 1.84, 'quantity' => 2), 
    array('group_id' => 15, 'team_price' => 13.00, 'satopay_price' => 11.00, 'team_id' => 344, 'origin' => 24, 'gain' => 1.84, 'quantity' => 2), 
); 
$new_arr = array(); 
foreach ($arr as $key => $value) { 
    add_array($value, &$new_arr, 'group_id'); //这里我们按group_id进行分组相加 
} 
var_dump($new_arr);
PHP 相关文章推荐
用PHP和MySQL保存和输出图片
Oct 09 PHP
php调用dll的实例操作动画与代码分享
Aug 14 PHP
解析PHP函数array_flip()在重复数组元素删除中的作用
Jun 27 PHP
PHP中批量生成静态html(命令行下运行PHP)
Apr 19 PHP
PHP数据库操作之基于Mysqli的数据库操作类库
Apr 19 PHP
PHP中session跨子域的三种实现方法
Jul 25 PHP
Yii框架实现邮箱激活的方法【数字签名】
Oct 18 PHP
利用PHP访问带有密码的Redis方法示例
Feb 09 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
PHP模糊查询技术实例分析【附源码下载】
Mar 07 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
Mar 26 PHP
PHP中国际化的字符串排序和比较对象详解
Aug 23 PHP
php不用正则验证真假身份证
Nov 06 #PHP
php 中文字符串首字母的获取函数分享
Nov 04 #PHP
PHP图片上传代码
Nov 04 #PHP
PHP CURL获取cookies模拟登录的方法
Nov 04 #PHP
php Session存储到Redis的方法
Nov 04 #PHP
在PHP中使用redis
Nov 04 #PHP
6种php上传图片重命名的方法实例
Nov 04 #PHP
You might like
PHP中冒号、endif、endwhile、endfor使用介绍
2010/04/28 PHP
php采集时被封ip的解决方法
2010/08/29 PHP
表格展示无限级分类(PHP版)
2012/08/21 PHP
php 中文字符串首字母的获取函数分享
2013/11/04 PHP
PHP中的命名空间相关概念浅析
2015/01/22 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
2016/01/28 PHP
Zend Framework+smarty用法实例详解
2016/03/19 PHP
简介PHP的Yii框架中缓存的一些高级用法
2016/03/29 PHP
在PHP语言中使用JSON和将json还原成数组的方法
2016/07/19 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
js Select下拉列表框进行多选、移除、交换内容的具体实现方法
2013/08/13 Javascript
js判断数据类型如判断是否为数组是否为字符串等等
2014/01/15 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
2014/06/09 Javascript
不到30行JS代码实现Excel表格的方法
2014/11/15 Javascript
Javascript基础教程之变量
2015/01/18 Javascript
JavaScript检测浏览器cookie是否已经启动的方法
2015/02/27 Javascript
jQuery实现仿淘宝带有指示条的图片转动切换效果完整实例
2015/03/04 Javascript
JQuery工具函数汇总
2015/06/15 Javascript
js原生Ajax的封装和原理详解
2017/03/11 Javascript
node文字生成图片的示例代码
2017/10/26 Javascript
vuex中的 mapState,mapGetters,mapActions,mapMutations 的使用
2018/04/13 Javascript
vue2.0的虚拟DOM渲染思路分析
2018/08/09 Javascript
javascript二维数组和对象的深拷贝与浅拷贝实例分析
2019/10/26 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
实现一个Vue自定义指令懒加载的方法示例
2020/06/04 Javascript
在vue中使用console.log无效的解决
2020/08/09 Javascript
手写Vue2.0 数据劫持的示例
2021/03/04 Vue.js
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
2015/05/22 Python
python隐藏终端执行cmd命令的方法
2019/06/24 Python
python实现斗地主分牌洗牌
2020/06/22 Python
python学习笔记之多进程
2020/08/06 Python
高二物理教学反思
2014/02/08 职场文书
经管应届生求职信范文
2014/05/18 职场文书
2015年世界无烟日活动总结
2015/02/10 职场文书
总经理司机岗位职责
2015/04/10 职场文书
win10滚动条自动往上跑怎么办?win10滚动条自动往上跑的解决方法
2022/08/05 数码科技