【问题标题】:PHP sum value of array with conditional有条件的数组的PHP总和值
【发布时间】:2019-07-28 11:07:15
【问题描述】:

我正在尝试对数组的值求和并检查值 <= 是否小于或等于 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 到他们两个.

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

【问题讨论】:

标签: php sum


【解决方案1】:

好吧,你需要遍历数组元素并跟踪你的索引和总和:

<?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
        )

)

【讨论】:

  • 这在 2 天内治愈了我的头痛,将阅读有关 array_walk 的更多信息......谢谢!
  • 这里的重点不是array_waslk(...)函数,而是如何跟踪sum和index。您可以使用简单的 for 或 foreach 循环来做同样的事情,但在我看来,上面更容易阅读,因为它清楚地封装了过程而不会污染调用函数的名称空间。
猜你喜欢
  • 2015-10-21
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多