【发布时间】: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 开始,是吗?然后你不需要任何next或array_slice恶作剧,你可以简单地通过它的索引访问前一个元素。foreach($result as $idx => $data)- 然后您可以简单地使用$result[$idx-1]访问上一项。 (如果 $idx 为 0,你不想这样做,不用说。) -
@DarkBee 我编辑了我的问题以提供一些示例数据和输出。请看一下。我希望它能澄清一些事情! @Ferhat BAŞ 和@CBroe 谢谢你的回复。我会研究你的两种方法。 @CBroe 我通过
$data变量访问$result变量,该变量从0 开始,是的!不过,我遇到的问题似乎在于我的嵌套 foreach 中。我会试着去理解、申请并拿回我所得到的。