重命名键并汇总值

时间:2019-10-01 07:36:12

标签: php arrays

我希望对此有所帮助,实际上我已经准备好代码,但是它很凌乱,它通过2个foreach循环完成,我想知道它是否可以以更优雅的方式完成。这是我的数组构造:

$result = Array([200001079412] => Array
                                  (
                                   [0] => INITAMNT:95.39,
                                   [1] => PAYAMNT:95.39,
                                   [2] => WRTOFFAMNT:0.00,
                                   [3] => OPENAMNT:0.00,
                                   [4] => INVAMNT:95.39,
                                   [5] => INITAMNT:91.08,
                                   [6] => PAYAMNT:91.08,
                                   [7] => WRTOFFAMNT:0.00,
                                   [8] => OPENAMNT:0.00,
                                   [9] => INVAMNT:91.08,
                                   [10] => INITAMNT:94.85,
                                   [11] => PAYAMNT:94.85,
                                   [12] => WRTOFFAMNT:0.00,
                                   [13] => OPENAMNT:0.00,
                                   [14] => INVAMNT:94.85,
                                  )

                 [200001672956] => Array
                                  (
                                   [0] => INITAMNT:127.40,
                                   [1] => PAYAMNT:127.40,
                                   [2] => WRTOFFAMNT:0.00,
                                   [3] => OPENAMNT:0.00,
                                   [4] => INVAMNT:704.40,
                                   )

我想:在第二级数组中,将键替换为值的字符部分,并用相同的键汇总所有值

在这里,我用值的字符部分替换了键:

$arr_new = array();                                     
foreach($result as $key => $arr) {
   foreach($arr as $key1 => $val) {
     $str = explode(":", $val);
     $arr_new[$key][$str[0]][$key1] = $str[1];
   }
}

这里我总结了所有具有相同键类别的值:

foreach ($arr_new as $key => $val) {
    foreach ($val as $k1 => $v1) {
         $val[$key][$k1] = array_sum($v1);
     }
}

这里是我的数组输出:

Array
(
[INITAMNT] => Array
    (
        [0] => 95.39,
        [5] => 91.08,
        [10] => 94.85,
    )

[PAYAMNT] => Array
    (
        [1] => 95.39,
        [6] => 91.08,
        [11] => 94.85,
    )

[WRTOFFAMNT] => Array
    (
        [2] => 0.00,
        [7] => 0.00,
        [12] => 0.00,
    )

[OPENAMNT] => Array
    (
        [3] => 0.00,
        [8] => 0.00,
        [13] => 0.00,
    )

[INVAMNT] => Array
    (
        [4] => 95.39,
        [9] => 91.08,
        [14] => 94.85,
    )

[200001079412] => Array
    (
        [INITAMNT] => 281.32
        [PAYAMNT] => 281.32
        [WRTOFFAMNT] => 0
        [OPENAMNT] => 0
        [INVAMNT] => 281.32
    )

)
Array
(
[INITAMNT] => Array
    (
        [0] => 127.40,
    )

[PAYAMNT] => Array
    (
        [1] => 127.40,
    )

[WRTOFFAMNT] => Array
    (
        [2] => 0.00,
    )

[OPENAMNT] => Array
    (
        [3] => 0.00,
    )

[INVAMNT] => Array
    (
        [4] => 704.40,
    )

[200001672956] => Array
    (
        [INITAMNT] => 127.4
        [PAYAMNT] => 127.4
        [WRTOFFAMNT] => 0
        [OPENAMNT] => 0
        [INVAMNT] => 704.4
    )

我只需要数组的最后一部分,例如:

Array ([200001079412] => Array
                        (
                         [INITAMNT] => 281.32
                         [PAYAMNT] => 281.32
                         [WRTOFFAMNT] => 0
                         [OPENAMNT] => 0
                         [INVAMNT] => 281.32
                        )
       [200001672956] => Array
                        (
                         [INITAMNT] => 127.4
                         [PAYAMNT] => 127.4
                         [WRTOFFAMNT] => 0
                         [OPENAMNT] => 0
                         [INVAMNT] => 704.4
                         )
 )

是否可以仅使用一个foreach循环以更简洁,更轻松的方式完成操作?谢谢。

3 个答案:

答案 0 :(得分:2)

您可以将代码合并为一个foreach循环,如下所示:

foreach ($result as $key => $arr) {
    foreach ($arr as $val) {
        list ($k, $v) = explode(':', $val);
        $newarr[$key][$k] = ($newarr[$key][$k] ?? 0) + $v;
    }
}
print_r($newarr);

输出:

Array
(
    [200001079412] => Array
        (
            [INITAMNT] => 281.32
            [PAYAMNT] => 281.32
            [WRTOFFAMNT] => 0
            [OPENAMNT] => 0
            [INVAMNT] => 281.32
        )
    [200001672956] => Array
        (
            [INITAMNT] => 127.4
            [PAYAMNT] => 127.4
            [WRTOFFAMNT] => 0
            [OPENAMNT] => 0
            [INVAMNT] => 704.4
        )
)

Demo on 3v4l.org

答案 1 :(得分:2)

这是foreach循环,

$arr_new = [];
foreach ($result as $key => $value) {
    array_walk($value, function($val) use(&$arr_new,$key){
        list($k,$v) = explode(":",$val);
        $arr_new[$key][$k] = ($arr_new[$key][$k] ?? 0) + $v;
    });
}

Demo

输出:-

Array
(
    [200001079412] => Array
        (
            [INITAMNT] => 281.32
            [PAYAMNT] => 281.32
            [WRTOFFAMNT] => 0
            [OPENAMNT] => 0
            [INVAMNT] => 281.32
        )

    [200001672956] => Array
        (
            [INITAMNT] => 127.4
            [PAYAMNT] => 127.4
            [WRTOFFAMNT] => 0
            [OPENAMNT] => 0
            [INVAMNT] => 704.4
        )

)

答案 2 :(得分:1)

您可以这样处理

 $r = [];
foreach($a as $k => $v){
 foreach($v as $k1 => $v1){
    $key   = substr($v1, 0, strpos($v1, ':'));
    $value = substr($v1, strpos($v1, ':')+1, strlen($v1));
    isset($r[$k][$key]) ? ($r[$k][$key] += $value) : ($r[$k][$key] = $value);
  }
} 

实时示例:-https://3v4l.org/p6ZCK