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控制linux服务器常用功能 关机 重启 开新站点等
Sep 05 PHP
php多层数组与对象的转换实例代码
Aug 05 PHP
访问编码后的中文URL返回404错误的解决方法
Aug 20 PHP
Yii不依赖Model的表单生成器用法实例
Dec 04 PHP
php输出xml属性的方法
Mar 19 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
Oct 09 PHP
PHP翻页跳转功能实现方法
Nov 30 PHP
简介WordPress中用于获取首页和站点链接的PHP函数
Dec 17 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
Aug 01 PHP
PHP常见字符串操作函数与用法总结
Mar 04 PHP
PhpSpreadsheet设置单元格常用操作汇总
Nov 13 PHP
PHP对接阿里云虚拟号的实现(号码隐私保护)
Apr 06 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
安装APACHE
2007/01/15 PHP
php Try Catch异常测试
2009/03/01 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
2013/06/26 PHP
举例详解PHP脚本的测试方法
2015/08/05 PHP
PHP批量去除BOM头内容信息代码
2016/03/11 PHP
PHP怎样用正则抓取页面中的网址
2016/08/09 PHP
如何实现动态删除javascript函数
2007/05/27 Javascript
javascript dom 操作详解 js加强
2009/07/13 Javascript
jQuery语法高亮插件支持各种程序源代码语法着色加亮
2013/04/27 Javascript
如何动态的导入js文件具体该怎么实现
2014/01/14 Javascript
jquery删除数据记录时的弹出提示效果
2014/05/06 Javascript
jQuery Validate表单验证入门学习
2015/12/18 Javascript
javascript阻止事件冒泡和浏览器的默认行为
2017/01/21 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
2017/04/21 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
浅谈VUE监听窗口变化事件的问题
2018/02/24 Javascript
Angular5中调用第三方js插件的方法
2018/02/26 Javascript
用POSTMAN发送JSON格式的POST请求示例
2018/09/04 Javascript
vue-cli系列之vue-cli-service整体架构浅析
2019/01/14 Javascript
vant 自定义 van-dropdown-item的用法
2020/08/05 Javascript
pandas DataFrame 根据多列的值做判断,生成新的列值实例
2018/05/18 Python
django 在原有表格添加或删除字段的实例
2018/05/27 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
2018/07/13 Python
Python如何发布程序的详细教程
2018/10/09 Python
python 递归调用返回None的问题及解决方法
2020/03/16 Python
基于Python计算圆周率pi代码实例
2020/03/25 Python
HTML5 常见面试题之PC端和移动端区别介绍
2018/01/22 HTML / CSS
Reebok官方旗舰店:美国知名健身品牌锐步
2019/01/07 全球购物
小区物业门卫岗位职责
2014/04/10 职场文书
大学开学计划书
2014/04/30 职场文书
产品售后服务承诺书
2014/05/21 职场文书
考察邀请函范文
2015/01/31 职场文书
挂职锻炼个人总结
2015/03/05 职场文书
慈善献爱心倡议书
2015/04/27 职场文书
nginx网站服务如何配置防盗链(推荐)
2021/03/31 Servers
python处理json数据文件
2022/04/11 Python