我希望对此有所帮助,实际上我已经准备好代码,但是它很凌乱,它通过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循环以更简洁,更轻松的方式完成操作?谢谢。
答案 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
)
)
答案 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;
});
}
输出:-
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