php 将二维数组数据分组并求和到平面关联数组中

qcbq4gxm  于 2023-03-16  发布在  PHP
关注(0)|答案(3)|浏览(161)

我试图解析一个带有不相关前导文本(将被删除)的字符串数组,然后创建一个关联数组,如果多次遇到相同的键,则对值求和。

$assessmentArr = [
    'a_b_money-rewards=30',
    'c_d_status-stability=15',
    'e_f_personal-professional-development=32',
    'g_h_community-support=9',
    'i_j_money-rewards=12',
    'k_l_status-stability=16',
    'm_n_personal-professional-development=29',
];

foreach($assessmentArr as $data) {
    $fullArr = explode("_", $data);
    $resultArr = explode("=", $fullArr[2]);
    // what do I do with $resultArr?
}

预期结果:

Array
(
    [community-support] => 33
    [money-rewards] => 42
    [status-stability] => 31
    [personal-professional-development] => 61
)

我发现了这个问题:How to merge two arrays by summing the merged values,它可以帮助我合并和添加值,但是我不确定当数组没有被赋给变量时该如何操作。我尝试做的事情是可能的还是我的方法不对?

eimct9ow

eimct9ow1#

不要把它弄得太复杂,只要检查结果数组中是否已经有一个元素具有那个键,如果没有,就初始化它,否则就添加它。
(Add循环中的此代码):

if(!isset($result[$resultArr[0]]))
    $result[$resultArr[0]] = $resultArr[1];
else
    $result[$resultArr[0]] += $resultArr[1];

这样就得到了所需的阵列:

print_r($result);
hivapdat

hivapdat2#

你可以这样做

$assessmentArr = explode("&", $assessmentData);
$finalArr = array();
foreach($assessmentArr as $data) {
    $fullArr = explode("_", $data);

    // Break down to only archetype and value
    $resultArr = explode("=", $fullArr[2]);
    if(array_key_exists($resultArr[1], $finalArr)){
        $finalArr[$resultArr[0]] += $resultArr[1];
    }else{
        $finalArr[$resultArr[0]] = $resultArr[1];
    }
}

首先检查数组中是否已经存在键,如果是,则将键的值添加到最后一个数组中的值,否则将新的索引添加到最后一个数组中,将resultArr中的值作为初始值。
......太慢了:/

bvjveswy

bvjveswy3#

在将文本解析为有意义的部分时,使用连字符串作为键,使用数字作为值。如果第一次遇到键,则存储0与当前值之和;否则求和并存储所述存储值和所述当前值。
代码:(Demo

$result = [];
foreach (explode("&", $assessmentData) as $data) {
    sscanf(preg_replace('/.*_/', '', $data), '%[^=]=%d', $k, $v);
    $result[$k] = ($result[$k] ?? 0) + $v;
}
var_export($result);

或者,要进行更直接的解析,请使用preg_match_all()调用。Demo

$result = [];
preg_match_all('/[^_]*_[^_]*_([^=]+)=(\d+)/', $assessmentData, $matches, PREG_SET_ORDER);
foreach ($matches as $m) {
    $result[$m[1]] = ($result[$m[1]] ?? 0) + $m[2];
}
var_export($result);

相关问题