【问题标题】:PHP- How to sum value using foreach with condition?PHP-如何在条件下使用 foreach 求和值?
【发布时间】:2020-11-13 23:31:25
【问题描述】:

我在数组中有一个这样的数组:

$myArr = [0=>['id1'=>'01','id2'=>'00','val'=>0],
          1=>['id1'=>'01','id2'=>'01','val'=>100],
          2=>['id1'=>'01','id2'=>'02','val'=>200],
          3=>['id1'=>'02','id2'=>'00','val'=>250],
          4=>['id1'=>'02','id2'=>'01','val'=>0],
          5=>['id1'=>'02','id2'=>'02','val'=>0],
         ...]

它是数组中的一个数组。当id2 的值为'00' 时,表示该数组是一个头部。 这意味着数组索引0是数组索引12等的头部。

我想在 PHP 中使用 foreach 创建一个新数组,每个头 val 的结果是他们的孩子 val 的总和。 但是如果他们已经有自己的val 则忽略它。

这是我想要的结果:

    $myArr = [0=>['id1'=>'01','id2'=>'00','val'=>300],
              1=>['id1'=>'01','id2'=>'01','val'=>100],
              2=>['id1'=>'01','id2'=>'02','val'=>200],
              3=>['id1'=>'02','id2'=>'00','val'=>250],
              4=>['id1'=>'02','id2'=>'01','val'=>0],
              5=>['id1'=>'02','id2'=>'02','val'=>0],
              ...]

【问题讨论】:

  • foreach 代码在哪里?
  • @Kevin 这就是我的要求。
  • SO 不是代码编写服务,您应该付出一些努力,人们会帮助解决您的问题。
  • 对不起,我是新来的@NigelRen,下次我会更具体。

标签: php arrays algorithm data-structures


【解决方案1】:

当然,您可以对其进行 foreach,并记住您遇到的最后一个 id2==00 记录的顶级索引。对于所有其他记录,您将这些值相加,直到遇到下一个 id2==00 记录。然后你需要用你之前记住的键将总和写入记录,记住新的键,然后重置你的总和变量。然后在循环结束/之后,当没有下一个 id2==00 记录时,您将不得不再次将最后一个总和写入最后一个记住的索引。或者……

...您只需使用 for 循环,以 reverse 顺序遍历数据。然后你可以对这些值求和,当你遇到一个 id2==00 记录时,你只需将当前的总和写入那里,重置你的总和,然后继续。这更容易一些,你不必记住任何索引,也不必单独处理最后一种情况。

$data = [
  ['id1'=>'01','id2'=>'00','val'=>0],
  ['id1'=>'01','id2'=>'01','val'=>100],
  ['id1'=>'01','id2'=>'02','val'=>200],
  ['id1'=>'02','id2'=>'00','val'=>250],
  ['id1'=>'02','id2'=>'01','val'=>0],
  ['id1'=>'02','id2'=>'02','val'=>0],
  ['id1'=>'03','id2'=>'00','val'=>200],
  ['id1'=>'03','id2'=>'01','val'=>20],
  ['id1'=>'03','id2'=>'02','val'=>20]
];

for($sum = 0, $i = count($data)-1; $i >= 0; --$i) {
  if($data[$i]['id2'] == '00') {
    if($data[$i]['val'] == 0) { // set sum only if there wasn’t a value already
      $data[$i]['val'] = $sum;
    }
    $sum = 0;
  }
  else {
    $sum += $data[$i]['val'];
  }
}

var_dump($data);

【讨论】:

  • 这就是我真正想要的。非常感谢。
【解决方案2】:

此类数据处理有多种方法。没有明确的对与错。通常,投资使您的任务更容易而不是解决它是值得的,因此在这种情况下降低了输入数据的复杂性。

如果这是不可能的,这是一种可能的方法:

<?php
$data = [
  ['id1'=>'01','id2'=>'00','val'=>0],
  ['id1'=>'01','id2'=>'01','val'=>100],
  ['id1'=>'01','id2'=>'02','val'=>200],
  ['id1'=>'02','id2'=>'00','val'=>250],
  ['id1'=>'02','id2'=>'01','val'=>0],
  ['id1'=>'02','id2'=>'02','val'=>0],
  ['id1'=>'03','id2'=>'00','val'=>200],
  ['id1'=>'03','id2'=>'01','val'=>20],
  ['id1'=>'03','id2'=>'02','val'=>20]
];

$i = 0; 
$j = 0;
while ($i < count($data)) {

  // sum up values of sequence
  $sum = 0;
  while (++$j < count($data) && $data[$j]['id1'] == $data[$i]['id1']) {
    $sum += $data[$j]['val'];
  }

  // replace value of sequence header if sum is not 0
  if ($sum > 0) {
    $data[$i]['val'] = $sum;
  }
  
  // jump to next sequence
  $i = $j;
}

print_r($data);

明显的输出是:

Array
(
    [0] => Array
        (
            [id1] => 01
            [id2] => 00
            [val] => 300
        )

    [1] => Array
        (
            [id1] => 01
            [id2] => 01
            [val] => 100
        )

    [2] => Array
        (
            [id1] => 01
            [id2] => 02
            [val] => 200
        )

    [3] => Array
        (
            [id1] => 02
            [id2] => 00
            [val] => 250
        )

    [4] => Array
        (
            [id1] => 02
            [id2] => 01
            [val] => 0
        )

    [5] => Array
        (
            [id1] => 02
            [id2] => 02
            [val] => 0
        )

    [6] => Array
        (
            [id1] => 03
            [id2] => 00
            [val] => 40
        )

    [7] => Array
        (
            [id1] => 03
            [id2] => 01
            [val] => 20
        )

    [8] => Array
        (
            [id1] => 03
            [id2] => 02
            [val] => 20
        )

)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2022-11-11
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多