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+SQLite存储方案
Sep 04 PHP
解析php mysql 事务处理回滚操作(附实例)
Aug 05 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
Feb 18 PHP
实例介绍PHP的Reflection反射机制
Aug 05 PHP
PHP+MySQL修改记录的方法
Jan 21 PHP
PHP统一页面编码避免乱码问题
Apr 09 PHP
PHP中preg_match函数正则匹配的字符串长度问题
May 27 PHP
Laravel与CI框架中截取字符串函数
May 08 PHP
浅谈PHP eval()函数定义和用法
Jun 21 PHP
php 实现一个字符串加密解密的函数实例代码
Nov 01 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
Mar 31 PHP
Centos7安装swoole扩展操作示例
Mar 26 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下几种删除目录的方法总结
2007/08/19 PHP
PHP的Yii框架中过滤器相关的使用总结
2016/03/29 PHP
php中mkdir()函数的权限问题分析
2016/09/24 PHP
PHP实现图片防盗链破解操作示例【解决图片防盗链问题/反向代理】
2020/05/29 PHP
图片onload事件触发问题解决方法
2011/07/31 Javascript
JSON语法五大要素图文介绍
2012/12/04 Javascript
js实现网页自动刷新可制作节日倒计时效果
2014/05/27 Javascript
jquery 获取 outerHtml 包含当前节点本身的代码
2014/10/30 Javascript
js闭包实现按秒计数
2015/04/23 Javascript
js兼容pc端浏览器并有多种弹出小提示的手机端浮层控件实例
2015/04/29 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
2015/05/15 Javascript
浅谈jQuery中的checkbox问题
2016/08/10 Javascript
JS正则子匹配实例分析
2016/12/22 Javascript
js数组与字符串常用方法总结
2017/01/13 Javascript
VueJs组件之父子通讯的方式
2018/05/06 Javascript
微信小程序之自定义组件的实现代码(附源码)
2018/08/02 Javascript
微信小程序提取公用函数到util.js及使用方法示例
2019/01/10 Javascript
javascript网页随机点名实现过程解析
2019/10/15 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
2020/07/28 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
小程序点餐界面添加购物车左右摆动动画
2020/09/23 Javascript
[01:07:21]NAVI vs VG Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
一行代码让 Python 的运行速度提高100倍
2018/10/08 Python
python dataframe向下向上填充,fillna和ffill的方法
2018/11/28 Python
Python 使用list和tuple+条件判断详解
2019/07/30 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
Java中compareTo和compare的区别
2016/04/12 面试题
一份软件工程师的面试试题
2016/02/01 面试题
十佳班主任事迹材料
2014/01/18 职场文书
党的群众路线批评与自我批评范文
2014/10/16 职场文书
出生公证书
2015/01/23 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
茶花女读书笔记
2015/06/29 职场文书
小学六一儿童节活动开幕词
2016/03/04 职场文书
Python Django / Flask如何使用Elasticsearch
2022/04/19 Python
Golang map映射的用法
2022/04/22 Golang