从关联数组 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; 
    }
}