【问题标题】:Get highest value from associative array foreach从关联数组 foreach 中获取最大值
【发布时间】:2015-10-16 09:26:02
【问题描述】:

我正在实施此处显示的第一个答案:Finding Highest Value in Associative Array

但实际情况是,它将找到的第一个值分配为“最大值”,然后当它找到下一个最大值时,它也将“最大值”分配给该值。

当然,我的目标是只将“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] 又名“max”函数在分配奖杯图标之前循环遍历整个每周值的关联数组?

编辑: 在 cmets 之后,我已将最后几节修改为以下内容,但现在我没有将奖杯分配给任何价值。我错过了什么?

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 } ?>

【问题讨论】:

  • 你能告诉我们你的预期输出吗?
  • 预期的输出是只将fa-trophy图标分配给每周的最高值
  • 先执行整个循环,然后在循环完成后使用max 的值输出。
  • if($week == $week) 有什么意义?这怎么可能是假的?
  • 在完成循环之前,您无法知道每周的最高值。在循环期间显示奖杯图标没有意义。

标签: php arrays foreach max associative-array


【解决方案1】:

在您在另一篇文章中收到的答案中:

$temp = array();
foreach ($data as $item) {
    foreach ($item as $key => $value) {
        $temp[$key] = max(
                isset($temp[$key]) ? $temp[$key] : $value,
                $value);
    }
}

您遍历所有对象数组,并在遍历所有数据元素时更新最大值。 这意味着当您到达该循环的末尾时,您将只有最大值(100% 确定)


如果你想要在最大值旁边打印一个奖杯图标,你需要事先知道那个元素是什么。

您有两种方法可以做到这一点:

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; 
    }
}

【讨论】:

  • 非常感谢您的周到和详细的回答。我决定循环两次(你的第一个建议)并找到了成功。如果时间允许,我会探讨您的第二个建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-29
  • 2016-10-31
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多