【问题标题】:Calculations multiple arrays in foreach loop?在foreach循环中计算多个数组?
【发布时间】:2021-10-26 22:17:28
【问题描述】:

我有一个数据库并对其执行 SQL 请求以检索数据。我在我的 SQL 请求中使用 LIMIT 语句一次只检索八行 SELECT-ed db-data,并使用 DESC 命令对返回的数据进行降序排序。然后可以通过执行 ajax 请求的专用加载按钮以相同的方式添加更多数据。

我的foreach ($result as $data) 中的数组具有以下结构/键值对。

  • print_r($data) 显示以下内容:
Array (
    [*keyname0*] => group-id
    [*keyname1*] => name of 1st-item
    [*keyname2*] => state of 1st-item
    [*keyname3*] => 93.42
    [*keyname4*] => unit of 1st-item
)

Array (
    [*keyname0*] => group-id
    [*keyname1*] => name of 2nd-item
    [*keyname2*] => state of 2nd-item
    [*keyname3*] => 93.12
    [*keyname4*] => unit of 2nd-item
)

Array (
    [*keyname0*] => group-id 
    [*keyname1*] => name of 3rd-item
    [*keyname2*] => state of 3rd-item
    [*keyname3*] => 89.92
    [*keyname4*] => unit of 3rd-item
)

Array (
    [*keyname0*] => group-id 
    [*keyname1*] => name of 4th-item
    [*keyname2*] => state of 4th-item
    [*keyname3*] => 89.70
    [*keyname4*] => unit of 4th-item
)
...

我的目标是计算由 foreach 循环(动态)创建的多个项目/数组

  • 计算应遵循以下逻辑:从第 2 项/数组的 keyname3 的值(即 93.12)中减去 keyname3 的值(即 93.42)第一项/数组,依此类推(即从第 1 个开始的第 2 个,从第 2 个开始的第 3 个,从第 3 个开始的第 4 个,从第 4 个开始的第 5 个等等)

上面显示的第一个数组的结果应该是:

  • 93.42 - 93.12 = -0.30
  • 93.12 - 89.92 = -3.20
  • 89.92 - 89.70 = -0.22
  • ...

我的尝试

  • 使用 next() 或 ararray_slice() 在变量 $data 中创建一个“移位”:$data['keyname3']-array_slice($data['keyname3'], 3, 1)。这没有用。

  • 在那之后,我的理论是使用来自不同 SQL 请求的两个变量。我在我的一个 SQL 请求中使用了 OFFSET 以跳过第一个数组。然后我创建了一个嵌套的 foreach 循环。这返回了一些有效的结果(其中包括我想要的值),但是由于嵌套的 foreach,对于上级 foreach 的每次迭代,它都会遍历下级 foreach 的所有值(如果这有意义的话)。通过使用休息,我至少能够正确地获得第一个值。这是我能得到的最接近我真正想要的东西。这就是此时代码的样子(div 被包裹在一个 foreach 中,如“foreach($result as $data):” 并以“endforeach;”结尾):

     <div class="classa">
         <div><img class="classb" src="../../../img/test.png" alt="Image"></div>
         <div class="classc"><p><?php echo number_format((round($data['keyname3'],2)),2,'.',' ') . " " . $data['keyname6']; ?></p></div>
         <div class="classd"><p><?php echo $data['keyname2'] ?></p></div>
     </div>
     <div class="classe">
         <p>
             <?php 
                 foreach($resultdiff as $key => $value) {
                     echo (round($value['keyname3']-$data['keyname3'],2));
                     if (++$count == 1) break;
                 }
             ?>
         </p>
     </div>
    

我的输出

这段代码结合 SQL 请求显示八个元素,包括图片、名称、相应项目的值和浏览器中的计算值。第一个元素包含该项目的正确计算并显示 -3.50 的值。到目前为止,一切都很好。然后,以下项目会显示一个值列表,如下所示。

  • 第二个:0,-3.2,-3.42,-4.99,-5.21,-5.22,-5.43,-5.55
  • 第三:3.2、0、-0.22、-1.79、-2.01、-2.02、-2.23、-2.35
  • ...

粗体值是该特定元素的正确值。当我按下加载按钮时,它真的变得很奇怪,因为所有值都堆叠在前一个之上。因此,带有单独 SQL 请求的嵌套 foreach 循环似乎对我不起作用! 有没有办法避免使用另一个变量进行单独的 SQL 请求,而只使用已经存在的变量 $data 来完成这项任务?

我是一个绝对的初学者,完全不确定这到底是完全错误的方法还是可能的正确方法。如果有人能为我解决这个问题或将我推向正确的方向,我将不胜感激。每个帮助都非常受欢迎,因为这是我项目的必备条件。

顺便说一句:我还没有研究过其他选择,比如使用 JavaScript。如果这可能是获得想要的结果的更合适的方法,那么这对我来说也很好。对于这个问题,我仍然坚持PHP

【问题讨论】:

  • 如果你知道你的数组模式意味着你可以在 foreach 中使用 foreach 2 多维,如果其他你可以使用 arraywalk 或递归函数。请搜索数组遍历和递归函数
  • 您能提供给我们示例数据和示例输出吗?只倾倒一个元素不会削减它。
  • 您的$result 是一个“标准”数组,连续的数字键从0 开始,是吗?然后你不需要任何nextarray_slice 恶作剧,你可以简单地通过它的索引访问前一个元素。 foreach($result as $idx =&gt; $data) - 然后您可以简单地使用 $result[$idx-1] 访问上一项。 (如果 $idx 为 0,你不想这样做,不用说。)
  • @DarkBee 我编辑了我的问题以提供一些示例数据和输出。请看一下。我希望它能澄清一些事情! @Ferhat BAŞ 和@CBroe 谢谢你的回复。我会研究你的两种方法。 @CBroe 我通过$data 变量访问$result 变量,该变量从0 开始,是的!不过,我遇到的问题似乎在于我的嵌套 foreach 中。我会试着去理解、申请并拿回我所得到的。

标签: php foreach


【解决方案1】:

正如 CBroe 在 cmets 中所说,您可以只使用 foreach 循环中的键/索引来创建总和

<?php
    $data = [
        [
            'indexname0' => 'group-id',
            'indexname1' => 'name of 1st-item',
            'indexname2' => 'state of 1st-item',
            'indexname3' => 93.42,
            'indexname4' => 'unit of 1st-item',
        ],
        [
            'indexname0' => 'group-id',
            'indexname1' => 'name of 1st-item',
            'indexname2' => 'state of 1st-item',
            'indexname3' => 93.12,
            'indexname4' => 'unit of 1st-item',
        ],
        [
            'indexname0' => 'group-id',
            'indexname1' => 'name of 1st-item',
            'indexname2' => 'state of 1st-item',
            'indexname3' => 89.92,
            'indexname4' => 'unit of 1st-item',
        ],
        [
            'indexname0' => 'group-id',
            'indexname1' => 'name of 1st-item',
            'indexname2' => 'state of 1st-item',
            'indexname3' => 89.70,
            'indexname4' => 'unit of 1st-item',
        ],
    ];


    foreach($data as $index => $value) {
        if (!isset($data[$index+1])) continue;
        echo $data[$index+1]['indexname3'] - $data[$index]['indexname3'].'<br />';
    }

demo

【讨论】:

  • 首先感谢代码。这似乎是我需要的。不幸的是,我很难适应我的情景。虽然您定义的 $data 变量代表最终数组,但我的 $data 变量首先在 foreach 标头 ($result as $data) 中定义。 $result 变量将准备好的语句的结果集保存为 mysqli_result 对象,因此我无法像那样访问它。因此$result as $index =&gt; $value 也不适合我。我错过了什么?谢谢!
  • 在你的第一次 foreach 之后运行代码?因此,在您将 SQL 结果结构化到新数组中之后
  • 在代码中挣扎了一段时间后,我终于做出了正确的调整并让它工作,使用fetch_all(MYSQLI_NUM);从我的结果集($result)中创建一个数字数组和在我现有的 foreach 中使用它,但没有将上述代码嵌套在另一个 foreach 中。干杯!
猜你喜欢
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 2014-03-03
  • 2017-11-16
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多