php 二维数组以某一键名进行分组相加

 更新时间:2016年11月25日 15:00  点击:1626
本文章来给各位同学介绍一篇关于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);

Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。从上述的定义中我们可以看到,Session实际上是一个特定的时间概念。

使用PHP应用session时,将session中的数据存储在服务器上,然后通过客户端传来的sessionID识别客户端的信息,并提取信息。

自己的一个实例

 代码如下 复制代码

<?php
session_start();//启动会话session,在session必须启动
$_SESSION['name']=”fangshan”;//设置session,name的值为fangshan
?>
<a href=”session2.php”>next</a>

(以上另存为session.php)

<?php
session_start();//启动会话
if(isset($_SESSION['name']))//判断是否存在
{
 echo $_SESSION['name'];
 echo “<a href=”deletesession.php”>del session</a>”;
}
else
{
 echo “Session has not been setted”;
}
?>

(以上另存为session2.php)

<?php
session_start();//启动session
unset($_SESSION['name']);//注销session变量
session_destroy();//清除session ID
header(“Location:session2.php”);//跳转回前面页面
?>

(以上另存为deletesession.php)


session的常用操作:

session的写入、读取、注册与删除。

session的开始

标记session使用开始的函数是session_start,session_start函数用于初始化session变量。语法如下:

session_start();

返回值为TRUE。

session的写入和读取

在PHP中,session的使用是通过预定义数组$_SESSION的调用和读取来完成。

在网站的页面中,在注册页面对$_SESSION数组进行赋值,在其他的页面中对$_SESSION数组进行读取。

注册页面中的session,例如:

 代码如下 复制代码
<?php
session_start();
$_SESSION['keyword']= "php";
?>

其他页面中的session,例如:

 代码如下 复制代码
<?php
session_start();
echo $_SESSION['keyword'];
?>

依次运行,结果是:

php

session的检测与注销

还记得isset和unset函数吗?这两个函数分别实现session的检测与注销。

isst函数用于检测session是否已经被存在,语法如下:

bool isset($_SESSION['session_name'])

例如:

 代码如下 复制代码

<?php
session_start();
if(isset($_SESSION['keyword']))
 echo $_SESSION['keyword'];
 else
  echo "www.111cn.net";
?>

结果:

php

usset函数用于注销已经建立的session变量。语法如下:

unset($_SESSION['session_name']))

例如:

 代码如下 复制代码

<?php
session_start();
unset($_SESSION['keyword']);
if(isset($_SESSION['keyword']))
  echo $_SESSION['keyword'];
  else
   echo "www.111cn.net";
?>

结果:

www.111cn.net


Php处理会话的函数一共有10个,我们详细介绍一下将要用到几个函数。

1、 session_start

函数功能:开始一个会话或者返回已经存在的会话。
函数原型:boolean session_start(void);
返回值:布尔值
功能说明:这个函数没有参数,且返回值均为true。最好将这个函数置于最先,而且在它之前不能有任何输出,否则会报警,如:Warning: Cannot send session cache limiter - headers already sent (output started at /usr/local/apache/htdocs/cga/member/1.php:2) in /usr/local/apache/htdocs/cga/member/1.php on line 3
2、 session_register

函数功能:登记一个新的变量为会话变量
函数原型:boolean session_register(string name);
返回值:布尔值。
功能说明:这个函数是在全局变量中增加一个变量到当前的SESSION中,参数name就是想要加入的变量名,成功则返回逻辑值true。可以用$_SESSION[name]或$HTTP_SESSION_VARS[name]的形式来取值或赋值。
3、 session_is_registered


函数功能:检查变量是否被登记为会话变量。
函数原型:boobean session_is_registered(string name);
返回值:布尔值
功能说明:这个函数可检查当前的session之中是否已有指定的变量注册,参数name就是要检查的变量名。成功则返回逻辑值true。
4、 session_unregister


函数功能:删除已注册的变量。
函数原型:boolean session_session_unregister(string name);
返回值:布尔值
功能说明:这个函数在当前的session之中删除全局变量中的变量。参数name就是欲删除的变量名,成功则返回true.
5、 Session_destroy


函数功能:结束当前的会话,并清空会话中的所有资源。
函数原型:boolean session destroy(void);
返回值:布尔值。
功能说明:这个函数结束当前的session,此函数没有参数,且返回值均为true
上面介绍函数下文将会用到,但还有一些有关session的函数也介绍一下:
6、 session_encode


函数功能:sesssion信息编码
函数原型:string session_encode(void);
返回值:字符串
功能说明:返回的字符串中包含全局变量中各变量的名称与值,形式如:a|s:12:"it is a test";c|s:4:"lala"; a是变量名 s:12代表变量a的值"it is a test的长度是12 变量间用分号”;”分隔。
7、 session_decode


函数功能:sesssion信息解码
函数原型:boolean session_decode (string data)
返回值:布尔值
功能说明:这个函数可将session信息解码,成功则返回逻辑值true
8、 session_name


函数功能:存取当前会话名称
函数原型:boolean session_name(string [name]);
返回值:字符串
功能说明:这个函数可取得或重新设置当前session的名称。若无参数name则表示获取当前session名称,加上参数则表示将session名称设为参数name
9、 session_id


函数功能:存取当前会话标识号
函数原型:boolean session_id(string [id]);
返回值:字符串
功能说明:这个函数可取得或重新设置当前存放session的标识号。若无参数id则表示只获取当前session的标识号,加上参数则表示将session的标识号设成新指定的id
10、 session_unset


函数功能:删除所有已注册的变量。
函数原型:void session_unset (void)
返回值:布尔值
功能说明:这个函数和Session_destroy不同,它不结束会话。就如同用函数session_unregister逐一注销掉所有的会话变量。

本文章来给各位同学介绍一下PHP父类调用子类方法实例,希望此教程对各位同学会有所帮助哦。

今天突然发现需要在父类中调用子类的方法,之前一直都没这么用过,通过实践发现也可以。例子如下:

 代码如下 复制代码

<?php
/**
 * 父类调用子类方法 基类
 * @author LNMP100
 *
 */
class BaseApp
{
    /**
     * 调用子类方法
     * @version  创建时间:2013-07-10
     */
    function _run_action()
        {
            $action = "index";
            $this->$action();
        }
}

class DefaultApp extends BaseApp
{

    /**
     * 此方法将在父类中调用
     */
    function index()
        {
            echo "DefaultApp->index() invoked";
        }

    function  Go(){
        //调用父类
        parent::_run_action();
    }
}

$default=new DefaultApp();
$default->Go();
//将显示DefaultApp->index() invoked

?>

我们在父类的go()方法里面调用了

$default->Go();

swim是子类定义的方法(注意,我们并没有在父类中定义abstract function swim()),说明了这不是多态。我们不仅调用了方法,还调用了成员,是ok的。

本文章来给各位同学介绍一篇关于php Base64编码文件二进制流主要使用在哪里,有举的朋友可参考一下,只简单的讲述了一下。

Base64编码文件二进制流是使用base64_encode函数对文件二进制信息进行编码。

官方说明

base64_encode — 使用 MIME base64 对数据进行编码

Report a bug 说明

string base64_encode ( string $data )
使用 base64 对 data 进行编码。

设计此种编码是为了使二进制数据可以通过非纯 8-bit 的传输层传输,例如电子邮件的主体。

Base64-encoded 数据要比原始数据多占用 33% 左右的空间。

具体方式为:

 代码如下 复制代码

$path = 'image.jpg';
$fp = fopen($path, 'rb');  // 以二进制形式打开文件
$content = fread($fp, filesize($path)); // 读取文件内容
fclose($fp);
$content = base64_encode($content); // 将二进制信息编码成字符串

// echo $content;

上述程序输出的结果类似:R0lGODlhEAAQAJECAISEhAAAhP///wAAACH5BAEAAAIALAAAAAAQABAAAAImlI
+pyxedQADQhVflpfAK30jG1lwmqIgWl6CClmKHxn6mdVb6zhcAOw==

这样我们成功将一个文件转换成了字符串。

解码过程非常简单,使用base64_decode($content)即可。

上述处理过程主要用途有:

1、接口传输

主要适用于通过WEB接口将文件从一个站点向另一个站点传输,可以用于XML信息。

2、存入数据库

当然,将图片等文件信息保存到数据库中完全可以不用这么做,但这种方式依然适用。对于数据库新手来说这种方式更可接受。因为这完全是一个字符串。

3、文件加密

文件加密可大家用得比较少,举个例子,假如我们有一套PHP程序需要保护,必须有授权码的用户才能正常运行,那么我们可能使用授权码来对文件进行加密,即将上述编码后的字符串再次加工。运行过程需要授权码才可运行。

当然还有其它用途,根据各人的需要灵活使用。

昨天还写了一篇关于数组合并的技术文章,那里我介绍的是一维数组合并,这里介绍一下php二维数组的合并方法,希望对各位同学会有所帮助哦。

例1

自定义方法合并数组

先看一个二维数组:

 代码如下 复制代码

<?php
Array (

          [0] => Array (

                              [A] => store_name

                              [B] => 商店一

                             )

          [1] => Array (

                              [A] => store_owner

                              [B] => 小风

                              )

          [2] => Array (

                              [A] => store_name

                              [B] => 商店二

                              )

          [3] => Array (

                               [A] => store_owner

                               [B] => 小磊

                               )

?>

大家会发现里面有两个 store_name 和 store_owner ,所以我想让他们合并成下面这样

<?php 

Array (

     [0] => Array

         (

           [A] => 商店一

           [B] => 小风

          )

      [1] => Array

         (

           [A] => 商店二

           [B] => 小磊

          )

?>

合并方法如下:

 代码如下 复制代码

<?php
$stores = array(); //定义一个空数组
        $store_count=count($showinfo);  //统计显示的次数,这里的$showinfo是我获取数据库内容时的一个变量,然后打印出来就是上面刚开始的样子
        for($i=0;$i<$store_count;$i++)
        {
            $j=$i+1;     //将 $i 加 1 跳过 一级  相当于 $j 取得是 键值为 奇数的值
            $stores[]=array(
                          'name' =>$showinfo[$i]['value'],
                          'owner'=>$showinfo[$j]['value'],
                          );
            $i = $j;  //  这里的作用是 相当于 $i 取得是 键值为 偶数的值
        }

?>

这样就可以得到上面的结果了!

为了让大家看的更清楚写 我把数据库表结构写出来 主要字段如下:

key value

store_name 网店一

store_owner 小风

store_name 网店二

store_owner 小磊

 

通过上面 的方法做过后 前台页面就可以以一排的方式显示了,如下

name owner

网店一 小风

网店二 小磊

例3

 代码如下 复制代码

<?php
$arr = array
(
    0 => array(
    '1@01,02',
    '2@01,02',
    '4@ALL',
    '3@01',
    '5@01,02,04',
    ),

    1 => array(
    '1@01,02,03',
    '2@01,02,04',
    '3@ALL',
    '4@01,02',
    '111@01,05',
    '5@03',
    ),
    2 => array(
    '1@01,02,03',
    '2@02,03,05',
    '3@ALL',
    '4@01,02,03',
    '111@01,05',
    '5@03',
    ),
);
$result = array();
foreach($arr as $items){
    if(is_array($items)){
        foreach($items as $item){
            $item = explode('@', $item);
            if(count($item) != 2){
                continue ;
            }
            $result[$item[0]] .= $item[1].',';
        }
    }
}
function reJoin(&$item,$key,$seq){
    $list = array_unique(explode($seq,$item));
    if (in_array('ALL', $list)){
        $item = $key.'@ALL';
    }else{
        $item = $key.'@'.join($seq,$list);
    }
}
array_walk($result, 'reJoin',',');
sort($result);
var_export($result);
/**
 * array (
  * 0 => '111@01,05,',
  * 1 => '1@01,02,03,',
  * 2 => '2@01,02,04,03,05,',
  * 3 => '3@ALL',
  * 4 => '4@ALL',
  * 5 => '5@01,02,04,03,',
  * )
 */
?>

[!--infotagslink--]

相关文章

  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python 图片转数组,二进制互转操作

    这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • php数组操作 键名比较 差集 交集赋值

    本文章提供在量的数据中级操作实例有如对键名比较计算数组的差集 计算差集 给指定数组中插入一个元素 反转数组 交集赋值新的数组实例。 //定义回调函数 funct...2016-11-25
  • C#二维数组基本用法实例

    这篇文章主要介绍了C#二维数组基本用法,以实例形式分析了C#中二维数组的定义、初始化、遍历及打印等用法,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C#数组的常用操作方法小结

    Array数组在C#中同样是最基本的数据结构,下面为大家C#数组的常用操作方法小结,皆为细小的代码段,欢迎收看收藏...2020-06-25
  • php curl模拟post请求和提交多维数组的示例代码

    下面一段代码给大家介绍php curl模拟post请求的示例代码,具体代码如下: <&#63;php$uri = "http://www.cnblogs.com/test.php";//这里换成自己的服务器的地址// 参数数组$data = array ( 'name' => 'tanteng'// 'passwor...2015-11-24
  • C# 拷贝数组的几种方法(总结)

    下面小编就为大家带来一篇C# 拷贝数组的几种方法(总结)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • PHP 二维数组根据某个字段排序的具体实现

    本文记录的要实现的功能类似于 MySQL 中的 ORDER BY,上个项目中有遇到这样的一个需求。 要求:从两个不同的表中获取各自的4条数据,然后整合(array_merge)成一个数组,再根据数据的创建时间降序排序取前4条。 遇到这个...2014-06-07
  • C#实现字符串转换成字节数组的简单实现方法

    这篇文章主要介绍了C#实现字符串转换成字节数组的简单实现方法,仅一行代码即可搞定,非常简单实用,需要的朋友可以参考下...2020-06-25
  • c#将字节数组转成易读的字符串的实现

    这篇文章主要介绍了c#将字节数组转成易读的字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • C#读取文件所有行到数组的方法

    这篇文章主要介绍了C#读取文件所有行到数组的方法,涉及C#针对文件及数组的相关操作技巧,需要的朋友可以参考下...2020-06-25
  • 将二维数组转为一维数组的2种方法

    如何将下面的二维数组转为一维数组。复制代码 代码如下:$msg = array(  array(    'id'=>'45',    'name'=>'jack'  ),  array(    'id'=>'34',    'name'=>'mary'  ),  array(    'id...2014-05-31
  • php中数组写入文件方法

    在php中为我们提供了一个函数var_export 他可以直接将php代码入到一个文件中哦。 代码如下 复制代码 var_export($times,true);后面不加tru...2016-11-25
  • PHP 如何获取二维数组中某个key的集合

    本文为代码分享,也是在工作中看到一些“大牛”的代码,做做分享。 具体是这样的,如下一个二维数组,是从库中读取出来的。 代码清单: 复制代码 代码如下: $user = array( 0 => array( 'id' => 1, 'name' => '张三', 'ema...2014-06-07
  • js有序数组的连接问题

    1.前言 昨天碰到一道关于如何解决有序数组的连接问题,这是一个很常见的问题。但是这里要考虑到代码的效率问题,因为要连接的数组都是有序的,这是一个非常重要的前提条件。2.简单但效率不高的算法 我首先想到的是使用...2013-10-04
  • python 实现将Numpy数组保存为图像

    今天小编就为大家分享一篇python 实现将Numpy数组保存为图像,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
  • C#中数组、ArrayList、List、Dictionary的用法与区别浅析(存取数据)

    在工作中经常遇到C#数组、ArrayList、List、Dictionary存取数据,但是该选择哪种类型进行存储数据呢?很迷茫,今天小编抽空给大家整理下这方面的内容,需要的朋友参考下吧...2020-06-25
  • C#中List和数组之间转换的方法

    这篇文章主要介绍了C#中List和数组之间转换的方法,涉及比较简单的转换技巧,需要的朋友可以参考下...2020-06-25
  • javascript中去除数组重复元素的实现方法【实例】

    下面小编就为大家带来一篇javascript中去除数组重复元素的实现方法【实例】。小编觉得挺不错的,现在分享给大家,也给大家做个参考,一起跟随小编过来看看吧...2016-04-16
  • Perl与JS的对比分析(数组、哈希)

    下面小编就为大家带来一篇Perl与JS的对比分析(数组、哈希)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-29