在foreach循环中计算多个数组?
Calculations multiple arrays in foreach loop?
我有一个数据库并对其执行 SQL 请求以检索数据。我在 SQL-请求中使用 LIMIT 语句一次仅检索八行 SELECT-ed 数据库数据,并使用 DESC-命令对返回的数据进行降序排序。然后可以通过执行 ajax-请求的专用加载按钮以相同的方式添加更多数据。
我的 foreach ($result as $data)
中的数组有以下 structure/key-value-pairs.
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 循环
(动态)创建的倍数 items/arrays
- 计算应该遵循这样的逻辑:从keyname3[的值中减去第2个item/array(即93.12)的keyname3的值 (即 93.42) 第 1 item/array 等等 (即第 2 来自第 1,第 3 来自第 2,第 4 来自第 3,第 5 来自第 4 等等)
上面显示的第一个数组的结果应该是相应的:
- 93.42 - 93.12 = -0.30
- 93.12 - 89.92 = -3.20
- 89.92 - 89.70 = -0.22
- ...
我的尝试
使用 next() 或 arrray_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
- 3rd: 3.2, 0, -0.22, -1.79, -2.01, -2.02, -2.23, -2.35
- ...
粗体值是该特定元素的正确值。当我按下加载按钮时,它真的变得很奇怪,因为所有值都堆叠在前一个值之上。所以带有单独的 SQL-request 的嵌套 foreach 循环似乎对我来说真的不起作用! 有没有办法避免单独的 SQL-request 与另一个变量并且只使用已经存在的变量 $data
来完成这个任务?
我是一个绝对的初学者,完全不确定这是完全错误的方法还是可能的正确途径。如果有人可以为我解决这个问题或将我推向正确的方向,我将不胜感激。我们非常欢迎您的帮助,因为这是我项目的必备条件。
顺便说一句:我还没有研究其他选择,比如使用 JavaScript。如果这可能是获得所需结果的更合适的方法,那么这对我来说也很好。对于这个问题,我仍然坚持PHP
。
正如 CBroe 在评论中所述,您只需在 foreach 循环中使用 key/index 来创建 sum
<?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 />';
}
我有一个数据库并对其执行 SQL 请求以检索数据。我在 SQL-请求中使用 LIMIT 语句一次仅检索八行 SELECT-ed 数据库数据,并使用 DESC-命令对返回的数据进行降序排序。然后可以通过执行 ajax-请求的专用加载按钮以相同的方式添加更多数据。
我的 foreach ($result as $data)
中的数组有以下 structure/key-value-pairs.
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 循环
(动态)创建的倍数 items/arrays- 计算应该遵循这样的逻辑:从keyname3[的值中减去第2个item/array(即93.12)的keyname3的值 (即 93.42) 第 1 item/array 等等 (即第 2 来自第 1,第 3 来自第 2,第 4 来自第 3,第 5 来自第 4 等等)
上面显示的第一个数组的结果应该是相应的:
- 93.42 - 93.12 = -0.30
- 93.12 - 89.92 = -3.20
- 89.92 - 89.70 = -0.22
- ...
我的尝试
使用 next() 或 arrray_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
- 3rd: 3.2, 0, -0.22, -1.79, -2.01, -2.02, -2.23, -2.35
- ...
粗体值是该特定元素的正确值。当我按下加载按钮时,它真的变得很奇怪,因为所有值都堆叠在前一个值之上。所以带有单独的 SQL-request 的嵌套 foreach 循环似乎对我来说真的不起作用! 有没有办法避免单独的 SQL-request 与另一个变量并且只使用已经存在的变量 $data
来完成这个任务?
我是一个绝对的初学者,完全不确定这是完全错误的方法还是可能的正确途径。如果有人可以为我解决这个问题或将我推向正确的方向,我将不胜感激。我们非常欢迎您的帮助,因为这是我项目的必备条件。
顺便说一句:我还没有研究其他选择,比如使用 JavaScript。如果这可能是获得所需结果的更合适的方法,那么这对我来说也很好。对于这个问题,我仍然坚持PHP
。
正如 CBroe 在评论中所述,您只需在 foreach 循环中使用 key/index 来创建 sum
<?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 />';
}