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 Memcache 中实现消息队列
Nov 24 PHP
PHP采集相关教程之一 CURL函数库
Feb 15 PHP
php防攻击代码升级版
Dec 29 PHP
有关php运算符的知识大全
Nov 03 PHP
smarty模板局部缓存方法使用示例
Jun 17 PHP
Smarty foreach控制循环次数的一些方法
Jul 01 PHP
PHP实现递归无限级分类
Oct 22 PHP
Codeigniter控制器controller继承问题实例分析
Jan 19 PHP
laravel学习教程之存取器
Jul 30 PHP
Laravel使用支付宝进行支付的示例代码
Aug 16 PHP
php获取微信共享收货地址的方法
Dec 21 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
Aug 03 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读取MySQL数据代码
2008/06/05 PHP
php在线打包程序源码
2008/07/27 PHP
php权重计算方法代码分享
2014/01/09 PHP
PHP请求远程地址设置超时时间的解决方法
2016/10/29 PHP
YII2 实现多语言配置的方法分享
2017/01/11 PHP
php中str_pad()函数用法分析
2017/03/28 PHP
javascript字母大小写转换的4个函数详解
2014/05/09 Javascript
js锁屏解屏通过对$.ajax进行封装实现
2014/07/31 Javascript
页面get请求 中文参数方法乱码问题的快速解决方法
2016/05/31 Javascript
js 动态生成json对象、时时更新json对象的方法
2016/12/02 Javascript
浅析Jquery操作select
2016/12/13 Javascript
基于angular实现模拟微信小程序swiper组件
2017/06/11 Javascript
深入理解vuex2.0 之 modules
2017/11/20 Javascript
AngularJS发送异步Get/Post请求方法
2018/08/13 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
2018/08/25 Javascript
vue.js实现二级菜单效果
2019/10/19 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
vue+iview使用树形控件的具体使用
2020/11/02 Javascript
[45:15]Optic vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
Python命名空间详解
2014/08/18 Python
详解Python中的__new__、__init__、__call__三个特殊方法
2016/06/02 Python
Python连接数据库学习之DB-API详解
2017/02/07 Python
pytorch torchvision.ImageFolder的用法介绍
2020/02/20 Python
解决Jupyter NoteBook输出的图表太小看不清问题
2020/04/16 Python
使用PyQt5实现图片查看器的示例代码
2020/04/21 Python
选购国际女性时装设计师品牌:IFCHIC(支持中文)
2018/04/12 全球购物
SKECHERS斯凯奇中国官网:来自美国的运动休闲品牌
2018/11/14 全球购物
法国隐形眼镜网站:VisionDirect.fr
2020/03/03 全球购物
Servlet的生命周期
2013/08/25 面试题
《雨霖铃》听课反思
2014/02/13 职场文书
公司领导班子对照材料
2014/08/18 职场文书
劳动争议和解协议书范本
2014/11/20 职场文书
钢琴师观后感
2015/06/12 职场文书
医院感染管理制度
2015/08/05 职场文书
Java内存模型之happens-before概念详解
2021/06/13 Java/Android
我家女友可不止可爱呢 公开OP主题曲无字幕动画MV
2022/04/11 日漫