对数组整数值求和并合并重复的非整数值

时间:2018-07-19 23:03:05

标签: php arrays sorting

我有一个如下所示的数组,我想将它们的非整数重复值作为与索引键关联的一个值,并在一个新索引中加上其下一个索引中的整数值。一个不是重复的,只需将它们排序在同一数组中即可。

我拥有的数据数组

Array
 (
 [0] => class 1
 [1] => 10
 [2] => class 1
 [3] => 10
 [4] => class 2
 [5] => 30
 [6] => late fine
 [7] => 50
 [8] => late fine
 [9] => 100
 )

我想要的方式

Array
 (
 [0] => class 1
 [1] => 20
 [2] => class 2
 [3] => 30
 [4] => late fine
 [5] => 150
 )

代码

$i=0; $x=0; $rec = array();

while($i < count($data)){       
    while($x < count($data)){           
        if($data[$i] == $data[$x]){         
            $rec[] = $data[$i];             
        }                   
        $x++;
    }

    $i++;
}       

2 个答案:

答案 0 :(得分:2)

我不知道为什么您要结束一个值数组,其中每个其他值都应代表前一个值的总和。

如果我是你,我会将它们排序为KV数组,如下所示:

$summed_array = [];
$array = [
    'class 1',
    40,
    'class 1',
    10,
    'class 2',
    20,
    'test 1',
    20,
    'test 1',
    40
]; // Your array

for( $i = 0; $i<count($array); $i++ ){

    // Do the following procedure for every other instance
    if( $i % 2 == 0 ){
        $summed_array[$array[$i]] = array_key_exists( $array[$i], $summed_array ) ? ( $summed_array[$array[$i]] + $array[$i+1] ) : $array[$i+1];
    }

}

这将为您提供如下输出:

Array ( [class 1] => 50 [class 2] => 20 [test 1] => 60 )

答案 1 :(得分:2)

我同意Ole Haugset,但是由于您坚持采用顺序结果,因此以下解决方案可以做到这一点:

$data = [
  'class 1',
  10,
  'class 1',
  10,
  'class 2',
  30,
  'late fine',
  50,
  'late fine',
  100
];

$temp = [];
foreach( array_chunk( $data, 2 ) as list( $key, $value ) ) {
  $temp[ $key ] = isset( $temp[ $key ] ) ? $temp[ $key ] + $value : $value;
}
// until here it was basically similar to Ole's solution

$result = [];
foreach( $temp as $key => $value ) {
  $result[] = $key;
  $result[] = $value;
}

var_dump( $result );

view parsed online @ eval.in