首页 > 解决方案 > 有条件的数组的PHP总和值

问题描述

我正在尝试对数组的值求和并检查值是否<=小于或等于10然后添加index具有值的新键:

源数组:

$arr= array(
    'all' => array(
        'db1' => array(
            'val' => 9.4,
            'ran' => 'ex'
        ),
        'db2' => array(
            'val' => 5.2,
            'ran' => 'as'
        ),
        'db3' => array(
            'val' => 2.5,
            'ran' => 'bm'
        ),
        'db4' => array(
            'val' => 7.4,
            'ran' => 'kl'
        ),
        'db5' => array(
            'val' => 2.9,
            'ran' => 'df'
        )
    )
);

结果数组:

$res = array(
    all => array(
        'db1' => array(
            'val' => 9.4,
            'ran' => 'ex',
            'index' => 1
        ),
        'db2' => array(
            'val' => 5.2,
            'ran' => 'as',
            'index' => 2
        ),
        'db3' => array(
            'val' => 2.5,
            'ran' => 'bm',
            'index' => 2
        ),
        'db4' => array(
            'val' => 7.1,
            'ran' => 'kl',
            'index' => 3
        ),
        'db5' => array(
            'val' => 2.9,
            'ran' => 'df',
            'index' => 3
        )
    )
);

正如我们所看到db1['val']的,不能求和,db2['val']因为结果将大于10所以添加索引 1,db2 和 db3 小于10所以将相同的索引 2 添加到它们。

任何帮助或建议将不胜感激。

标签: phpsum

解决方案


那么,您需要遍历数组元素并跟踪您的索引和总和:

<?php
$data = [
    'db1' => ['val' => 9.4, 'ran' => 'ex'],
    'db2' => ['val' => 5.2, 'ran' => 'as'],
    'db3' => ['val' => 2.5, 'ran' => 'bm'],
    'db4' => ['val' => 7.4, 'ran' => 'kl'],
    'db5' => ['val' => 2.9, 'ran' => 'df']
];

$sum = 0;
$index = 1;
array_walk($data, function(&$entry) use (&$sum, &$index) {
    $sum += $entry['val'];
    if ($sum >= 10) {
        $index++;
        $sum -= 10;
    }
    $entry['index'] = $index;
});

print_r($data);

这个变体甚至会更紧凑、更简洁,但更难阅读并且有点风险:

<?php
$data = [
    'db1' => ['val' => 9.4, 'ran' => 'ex'],
    'db2' => ['val' => 5.2, 'ran' => 'as'],
    'db3' => ['val' => 2.5, 'ran' => 'bm'],
    'db4' => ['val' => 7.4, 'ran' => 'kl'],
    'db5' => ['val' => 2.9, 'ran' => 'df']
];

array_walk($data, function(&$entry) use (&$sum, &$index) {
    $sum += $entry['val'];
    if ($sum >= 10) {
        $index++;
        $sum -= 10;
    }
    $entry['index'] = $index + 1;
});

print_r($data);

明显的输出是:

Array
(
    [db1] => Array
        (
            [val] => 9.4
            [ran] => ex
            [index] => 1
        )

    [db2] => Array
        (
            [val] => 5.2
            [ran] => as
            [index] => 2
        )

    [db3] => Array
        (
            [val] => 2.5
            [ran] => bm
            [index] => 2
        )

    [db4] => Array
        (
            [val] => 7.4
            [ran] => kl
            [index] => 3
        )

    [db5] => Array
        (
            [val] => 2.9
            [ran] => df
            [index] => 3
        )

)

推荐阅读