从关联数组 foreach 中获取最高值
Get highest value from associative array foreach
我正在执行此处显示的第一个答案:Finding Highest Value in Associative Array
但是发生的事情是它将它找到的第一个值分配为 "max",然后当它找到下一个最高值时,它也将 "max" 分配给该值。
当然我的目标是只将"max"分配给最高值。
问题一定出在我呈现值的方式上。
这是数组(我每周将 "max" 分配给 'sum' 索引:
Array
(
[0] => stdClass Object
(
[userid] => 1
[week] => 1
[sum] => 28
[user] => al
)
[1] => stdClass Object
(
[userid] => 1
[week] => 2
[sum] => 33
[user] => al
)
[2] => stdClass Object
(
[userid] => 1
[week] => 3
[sum] => 29
[user] => al
)
...
[17] => stdClass Object
(
[userid] => 26
[week] => 1
[sum] => 14
[user] => bob
)
[18] => stdClass Object
(
[userid] => 26
[week] => 2
[sum] => 23
[user] => bob
)
[19] => stdClass Object
(
[userid] => 26
[week] => 3
[sum] => 35
[user] => bob
)
...
[34] => stdClass Object
(
[userid] => 27
[week] => 1
[sum] => 36
[user] => chuck
)
[35] => stdClass Object
(
[userid] => 27
[week] => 2
[sum] => 23
[user] => chuck
)
[36] => stdClass Object
(
[userid] => 27
[week] => 3
[sum] => 29
[user] => chuck
)
但我通过几个 foreach 循环传送数据:
<?php
$resultsByUser = array();
$temp = array();
foreach($results as $result) {
$resultsByUser[$result->user][$result->week] = $result->sum;
}
foreach($resultsByUser as $user => $resultsByWeek) {
print "<tr><td>$user</td>";
ksort($resultsByWeek);
foreach($resultsByWeek as $week => $sum) {
$temp[$week] = max(
isset($temp[$week]) ? $temp[$week] : $sum,
$sum);
if($week == $week) {
if($temp[$week] == $sum) { ?>
<td><?php echo $sum; ?><span><i class='fa fa-trophy'></i></span></td>
<?php } else { ?>
<td><?php echo $sum; ?></td>
<?php }
}
}
} ?>
如何在分配奖杯图标之前强制 $temp[week] aka "max" 函数循环遍历每周值的整个关联数组?
编辑:
发表评论后,我将最后几节修改为以下内容,但现在我没有为奖杯分配任何值。我错过了什么?
foreach($resultsByWeek as $week => $sum) {
$temp[$week] = max(
isset($temp[$week]) ? $temp[$week] : $sum,
$sum); ?>
<td><?php echo $sum; }}?>
<?php if($sum == $temp[$week]) { ?> <span><i class='fa fa-trophy'></i></span></td>
<?php } ?>
在对方收到的回答中post:
$temp = array();
foreach ($data as $item) {
foreach ($item as $key => $value) {
$temp[$key] = max(
isset($temp[$key]) ? $temp[$key] : $value,
$value);
}
}
您遍历所有对象数组,在遍历所有数据元素时更新最大值。
这意味着 当您到达该循环的末尾时,您将只有最大值(100% 确定性)。
如果你想要在最大值旁边打印一个奖杯图标,你需要事先知道那个元素是什么。
您有 2 种方法可以做到这一点:
1.使用两个循环
使用第一个循环,不写入,只是为了找到最大值。
然后使用第二个循环,写入对象数据。并且,如果第一次循环收集到的最大值等于对象数据,则绘制奖杯图标。
类似于:
$temp = array();
foreach ($data as $item) {
foreach ($item as $key => $value) {
$temp[$key] = max(
isset($temp[$key]) ? $temp[$key] : $value,
$value);
}
}
foreach ($data as $item) {
foreach ($item as $key => $value) {
echo $user_data;
if ($user_data_sum == $temp[$key])
echo "<trophy image>";
}
}
2。保存在对象上是最大值(或奖杯)
如果可以编辑对象,请保存对象的最大值。这将减少处理时间,因为您只需要一个循环而不是上面的两个循环。
类似于:
[0] => stdClass Object
(
[userid] => 1
[week] => 1
[sum] => 28
[user] => al
[is_max] => false
)
[1] => stdClass Object
(
[userid] => 1
[week] => 2
[sum] => 33
[user] => al
[is_max] => true
)
在循环中使用:
foreach ($data as $item) {
foreach ($item as $key => $value) {
echo $user_data;
if ($user_data_is_max)
echo "<trophy image>";
}
}
甚至:
[0] => stdClass Object
(
[userid] => 1
[week] => 1
[sum] => 28
[user] => al
[trophy] => ""
)
[1] => stdClass Object
(
[userid] => 1
[week] => 2
[sum] => 33
[user] => al
[trophy] => "<trophy image>"
)
在循环中使用只打印(不需要 if):
foreach ($data as $item) {
foreach ($item as $key => $value) {
echo $user_data . $user_data_trophy;
}
}
我正在执行此处显示的第一个答案:Finding Highest Value in Associative Array
但是发生的事情是它将它找到的第一个值分配为 "max",然后当它找到下一个最高值时,它也将 "max" 分配给该值。
当然我的目标是只将"max"分配给最高值。
问题一定出在我呈现值的方式上。
这是数组(我每周将 "max" 分配给 'sum' 索引:
Array
(
[0] => stdClass Object
(
[userid] => 1
[week] => 1
[sum] => 28
[user] => al
)
[1] => stdClass Object
(
[userid] => 1
[week] => 2
[sum] => 33
[user] => al
)
[2] => stdClass Object
(
[userid] => 1
[week] => 3
[sum] => 29
[user] => al
)
...
[17] => stdClass Object
(
[userid] => 26
[week] => 1
[sum] => 14
[user] => bob
)
[18] => stdClass Object
(
[userid] => 26
[week] => 2
[sum] => 23
[user] => bob
)
[19] => stdClass Object
(
[userid] => 26
[week] => 3
[sum] => 35
[user] => bob
)
...
[34] => stdClass Object
(
[userid] => 27
[week] => 1
[sum] => 36
[user] => chuck
)
[35] => stdClass Object
(
[userid] => 27
[week] => 2
[sum] => 23
[user] => chuck
)
[36] => stdClass Object
(
[userid] => 27
[week] => 3
[sum] => 29
[user] => chuck
)
但我通过几个 foreach 循环传送数据:
<?php
$resultsByUser = array();
$temp = array();
foreach($results as $result) {
$resultsByUser[$result->user][$result->week] = $result->sum;
}
foreach($resultsByUser as $user => $resultsByWeek) {
print "<tr><td>$user</td>";
ksort($resultsByWeek);
foreach($resultsByWeek as $week => $sum) {
$temp[$week] = max(
isset($temp[$week]) ? $temp[$week] : $sum,
$sum);
if($week == $week) {
if($temp[$week] == $sum) { ?>
<td><?php echo $sum; ?><span><i class='fa fa-trophy'></i></span></td>
<?php } else { ?>
<td><?php echo $sum; ?></td>
<?php }
}
}
} ?>
如何在分配奖杯图标之前强制 $temp[week] aka "max" 函数循环遍历每周值的整个关联数组?
编辑: 发表评论后,我将最后几节修改为以下内容,但现在我没有为奖杯分配任何值。我错过了什么?
foreach($resultsByWeek as $week => $sum) {
$temp[$week] = max(
isset($temp[$week]) ? $temp[$week] : $sum,
$sum); ?>
<td><?php echo $sum; }}?>
<?php if($sum == $temp[$week]) { ?> <span><i class='fa fa-trophy'></i></span></td>
<?php } ?>
在对方收到的回答中post:
$temp = array();
foreach ($data as $item) {
foreach ($item as $key => $value) {
$temp[$key] = max(
isset($temp[$key]) ? $temp[$key] : $value,
$value);
}
}
您遍历所有对象数组,在遍历所有数据元素时更新最大值。 这意味着 当您到达该循环的末尾时,您将只有最大值(100% 确定性)。
如果你想要在最大值旁边打印一个奖杯图标,你需要事先知道那个元素是什么。
您有 2 种方法可以做到这一点:
1.使用两个循环
使用第一个循环,不写入,只是为了找到最大值。 然后使用第二个循环,写入对象数据。并且,如果第一次循环收集到的最大值等于对象数据,则绘制奖杯图标。
类似于:
$temp = array();
foreach ($data as $item) {
foreach ($item as $key => $value) {
$temp[$key] = max(
isset($temp[$key]) ? $temp[$key] : $value,
$value);
}
}
foreach ($data as $item) {
foreach ($item as $key => $value) {
echo $user_data;
if ($user_data_sum == $temp[$key])
echo "<trophy image>";
}
}
2。保存在对象上是最大值(或奖杯)
如果可以编辑对象,请保存对象的最大值。这将减少处理时间,因为您只需要一个循环而不是上面的两个循环。
类似于:
[0] => stdClass Object
(
[userid] => 1
[week] => 1
[sum] => 28
[user] => al
[is_max] => false
)
[1] => stdClass Object
(
[userid] => 1
[week] => 2
[sum] => 33
[user] => al
[is_max] => true
)
在循环中使用:
foreach ($data as $item) {
foreach ($item as $key => $value) {
echo $user_data;
if ($user_data_is_max)
echo "<trophy image>";
}
}
甚至:
[0] => stdClass Object
(
[userid] => 1
[week] => 1
[sum] => 28
[user] => al
[trophy] => ""
)
[1] => stdClass Object
(
[userid] => 1
[week] => 2
[sum] => 33
[user] => al
[trophy] => "<trophy image>"
)
在循环中使用只打印(不需要 if):
foreach ($data as $item) {
foreach ($item as $key => $value) {
echo $user_data . $user_data_trophy;
}
}