Heim >Backend-Entwicklung >PHP-Tutorial >数组针对某项的求和问题

数组针对某项的求和问题

WBOY
WBOYOriginal
2016-06-23 14:20:281009Durchsuche

已知数组a:

array (  0 =>   array (    'stock_no' => 'SU13080800340',    'adress' => 'B',    'arr_time' => '2013-08-14 09:00:00',    'c_type' => 'P32E',    'cust_no' => '310F61VA5A',    'mount_total' => '1',    'total' => '16',    'c1_time' => '2013-08-10 15:00:00',    'packageno' => 'CVT121015001',  ),  1 =>   array (    'stock_no' => 'SU13080800340',    'adress' => 'B',    'arr_time' => '2013-08-14 09:00:00',    'c_type' => 'P32E',    'cust_no' => '310F61VA5B',    'mount_total' => '2',    'total' => '32',    'c1_time' => '2013-08-10 15:00:00',    'packageno' => 'CVT121015002',  ),  2 =>   array (    'stock_no' => 'SU13080800340',    'adress' => 'B',    'arr_time' => '2013-08-14 09:00:00',    'c_type' => 'P32E',    'cust_no' => '310F61VA5B',    'mount_total' => '2',    'total' => '32',    'c1_time' => '2013-08-10 15:00:00',    'packageno' => 'CVT121226001',  ),)


如何分别求得数组中的项cust_no对应的packageno的结果以及stock_no对应mount_total和total项求和的结果?
假设cust_no为310F61VA5A时,对应的packageno为CVT121225001。
    cust_no为310F61VA5B时,对应的packageno为CVT121225002,CVT121226001。

stock_no为SU13080800340时,求得的mount_total结果为3(1+2),total结果为48(16+32)。

如何达到这样的效果?


回复讨论(解决方案)

	$a = array (   0 =>    array (     'stock_no' => 'SU13080800340',     'adress' => 'B',     'arr_time' => '2013-08-14 09:00:00',     'c_type' => 'P32E',     'cust_no' => '310F61VA5A',     'mount_total' => '1',     'total' => '16',     'c1_time' => '2013-08-10 15:00:00',     'packageno' => 'CVT121015001',   ),   1 =>    array (     'stock_no' => 'SU13080800340',     'adress' => 'B',     'arr_time' => '2013-08-14 09:00:00',     'c_type' => 'P32E',     'cust_no' => '310F61VA5B',     'mount_total' => '2',     'total' => '32',     'c1_time' => '2013-08-10 15:00:00',     'packageno' => 'CVT121015002',   ),   2 =>    array (     'stock_no' => 'SU13080800340',     'adress' => 'B',     'arr_time' => '2013-08-14 09:00:00',     'c_type' => 'P32E',     'cust_no' => '310F61VA5B',     'mount_total' => '2',     'total' => '32',     'c1_time' => '2013-08-10 15:00:00',     'packageno' => 'CVT121226001',   ), );function foo1($cust_no,$a=array()){	foreach($a as $each){		if($each['cust_no'] == $cust_no){			$res[] = $each['packageno'];		}	}	if($res){		return implode(",",$res);	}else{		return false;	}}function foo2($stock_no,$a=array()){	foreach($a as $each){		if($each['stock_no'] == $stock_no){			$mount_total[] = $each['mount_total'];			$total[] = $each['total'];		}	}	$mount_total = array_unique($mount_total);		//去重复	$total = array_unique($total);	$res['mount_total'] = array_sum($mount_total);	$res['total'] = array_sum($total);	return $res;}var_export(foo1("310F61VA5B",$a));var_export(foo2("SU13080800340",$a));


'CVT121015002,CVT121226001'
array ( 'mount_total' => 3, 'total' => 48, ) 

$ar=array (  0 =>   array (    'stock_no' => 'SU13080800340',    'adress' => 'B',    'arr_time' => '2013-08-14 09:00:00',    'c_type' => 'P32E',    'cust_no' => '310F61VA5A',    'mount_total' => '1',    'total' => '16',    'c1_time' => '2013-08-10 15:00:00',    'packageno' => 'CVT121015001',  ),  1 =>   array (    'stock_no' => 'SU13080800340',    'adress' => 'B',    'arr_time' => '2013-08-14 09:00:00',    'c_type' => 'P32E',    'cust_no' => '310F61VA5B',    'mount_total' => '2',    'total' => '32',    'c1_time' => '2013-08-10 15:00:00',    'packageno' => 'CVT121015002',  ),  2 =>   array (    'stock_no' => 'SU13080800340',    'adress' => 'B',    'arr_time' => '2013-08-14 09:00:00',    'c_type' => 'P32E',    'cust_no' => '310F61VA5B',    'mount_total' => '2',    'total' => '32',    'c1_time' => '2013-08-10 15:00:00',    'packageno' => 'CVT121226001',  ),);foreach($ar as $v){    $a[$v['cust_no']][]=$v['packageno'];	$b[$v['stock_no']][]=$v['mount_total'];	$c[$v['stock_no']][]=$v['total'];}print_r($a);print_r($b);print_r($c);

Array
(
    [310F61VA5A] => Array
        (
            [0] => CVT121015001
        )

    [310F61VA5B] => Array
        (
            [0] => CVT121015002
            [1] => CVT121226001
        )

)
Array
(
    [SU13080800340] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 2
        )

)
Array
(
    [SU13080800340] => Array
        (
            [0] => 16
            [1] => 32
            [2] => 32
        )

)

第一个问题 循环数组 判断每一个cust_no字段的值为给定值的数组元素的packageno的值加起来 就是你要的结果.  

第二个问题 循环数组 判断每一个stock_no字段的值为给定值的数组元素的两个要求字段的值存入数组,循环结束后分别去除重复的然后相加

$a = array (  0 =>   array (    'stock_no' => 'SU13080800340',    'adress' => 'B',    'arr_time' => '2013-08-14 09:00:00',    'c_type' => 'P32E',    'cust_no' => '310F61VA5A',    'mount_total' => '1',    'total' => '16',    'c1_time' => '2013-08-10 15:00:00',    'packageno' => 'CVT121015001',  ),  1 =>   array (    'stock_no' => 'SU13080800340',    'adress' => 'B',    'arr_time' => '2013-08-14 09:00:00',    'c_type' => 'P32E',    'cust_no' => '310F61VA5B',    'mount_total' => '2',    'total' => '32',    'c1_time' => '2013-08-10 15:00:00',    'packageno' => 'CVT121015002',  ),  2 =>   array (    'stock_no' => 'SU13080800340',    'adress' => 'B',    'arr_time' => '2013-08-14 09:00:00',    'c_type' => 'P32E',    'cust_no' => '310F61VA5B',    'mount_total' => '2',    'total' => '32',    'c1_time' => '2013-08-10 15:00:00',    'packageno' => 'CVT121226001',  ),);$res = array();foreach($a as $item) {  if(! isset($res[$item['stock_no']][$item['cust_no']])) {    $res[$item['stock_no']][$item['cust_no']] = $item;  }else {    $res[$item['stock_no']][$item['cust_no']]['mount_total'] += $item['mount_total'];    $res[$item['stock_no']][$item['cust_no']]['total'] += $item['total'];    $res[$item['stock_no']][$item['cust_no']]['packageno'] .= ',' .$item['packageno'];  }}foreach($res as &$item) $item = array_values($item);print_r($res);
Array
(
    [SU13080800340] => Array
        (
            [0] => Array
                (
                    [stock_no] => SU13080800340
                    [adress] => B
                    [arr_time] => 2013-08-14 09:00:00
                    [c_type] => P32E
                    [cust_no] => 310F61VA5A
                    [mount_total] => 1
                    [total] => 16
                    [c1_time] => 2013-08-10 15:00:00
                    [packageno] => CVT121015001
                )

            [1] => Array
                (
                    [stock_no] => SU13080800340
                    [adress] => B
                    [arr_time] => 2013-08-14 09:00:00
                    [c_type] => P32E
                    [cust_no] => 310F61VA5B
                    [mount_total] => 4
                    [total] => 64
                    [c1_time] => 2013-08-10 15:00:00
                    [packageno] => CVT121015002,CVT121226001
                )

        )

)

[code=php]
Array
(
    [310F61VA5A] => Array
        (
            [0] => CVT121015001
        )

    [310F61VA5B] => Array
        (
            [0] => CVT121015002
            [1] => CVT121226001
        )

)
Array
(
    [SU13080800340] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 2
        )

)
Array
(
    [SU13080800340] => Array
        (
            [0] => 16
            [1] => 32
            [2] => 32
        )

)

第一项OK,但是mount_total和total的求和结果不对,我要的是stock_no为SU13080800340时,求得的mount_total结果为3(1+2),total结果为48(16+32)。

$res = array();foreach($a as $item) {  if(! isset($res[$item['stock_no']][$item['cust_no']])) {    $res[$item['stock_no']][$item['cust_no']] = $item;  }else {    $res[$item['stock_no']][$item['cust_no']]['mount_total'] += $item['mount_total'];    $res[$item['stock_no']][$item['cust_no']]['total'] += $item['total'];    $res[$item['stock_no']][$item['cust_no']]['packageno'] .= ',' .$item['packageno'];  }}foreach($res as &$item) $item = array_values($item);print_r($res);


我想要得到的stockno的求和结果是mount_total为3(2+1),total结果为48(16+32)。

楼主这种问题  应该算是比较基础的  我有点好奇为什么会纠结于
Array
        (
            [0] => 16
            [1] => 32
            [2] => 32
        )
这种数组的加和? 你的需求应该是去了重复求和....  一个PHP函数的事情...

你的数组中三个stock_no的值不是一样的吗,都为 SU13080800340 吧,难道我眼花了?

那是你的数据给错了
    'cust_no' => '310F61VA5A',
    'mount_total' => '1',
    'total' => '16',

    'cust_no' => '310F61VA5B',
    'mount_total' => '2',
    'total' => '32',

    'cust_no' => '310F61VA5B',
    'mount_total' => '2',
    'total' => '32',

那是你的数据给错了
    'cust_no' => '310F61VA5A',
    'mount_total' => '1',
    'total' => '16',

    'cust_no' => '310F61VA5B',
    'mount_total' => '2',
    'total' => '32',

    'cust_no' => '310F61VA5B',
    'mount_total' => '2',
    'total' => '32',
那我再想想。

你的数组中三个stock_no的值不是一样的吗,都为 SU13080800340 吧,难道我眼花了?
那怎么去重复求和呢?

那是你的数据给错了
    'cust_no' => '310F61VA5A',
    'mount_total' => '1',
    'total' => '16',

    'cust_no' => '310F61VA5B',
    'mount_total' => '2',
    'total' => '32',

    'cust_no' => '310F61VA5B',
    'mount_total' => '2',
    'total' => '32',
如果是去重复求和呢?


那是你的数据给错了
    'cust_no' => '310F61VA5A',
    'mount_total' => '1',
    'total' => '16',

    'cust_no' => '310F61VA5B',
    'mount_total' => '2',
    'total' => '32',

    'cust_no' => '310F61VA5B',
    'mount_total' => '2',
    'total' => '32',
如果是去重复求和呢?

去重复求和  抬头看看一楼....

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn