【问题标题】:php save array value in a session while loopingphp在循环时将数组值保存在会话中
【发布时间】:2016-09-07 01:47:53
【问题描述】:

我有一个这样的数组

[0] => Mike
[1] => 933
[2] => Josh
[3] => 1245
...

打印出这样的表格

Name    Total   Change
Mike    933     x
Josh    1245    x

使用以下脚本

$counter = 1;
$sessionID = 0;
foreach ($array as $value) {
 if(++$counter % 2 === 0) {
  echo "<tr><td class='value'>".$value."</td>";
 } else {
  echo "<td class='value'>".$value."</td>";
   $sessionID++;
  echo "<td class='update'>"x"</td>";
 }
}

循环时我想将当前的“$value”保存在会话中,因此当用户刷新页面时 x 将显示 $value - $_SESSION[$oldvalue],例如 943-933=10,结果将是

Name    Total   Change
Mike    943     10
Josh    1045    -200

希望你明白我要做什么。如果有帮助,下面是单个用户的工作测试版本。到目前为止,我尝试过同样的想法,但没有成功。

$old = ($array[1] - $_SESSION["oldvalue"]);

echo "<tr><td class='value'>".$array[0]."";
echo "</td><td class='value'>".$array[1]."";

$_SESSION["oldvalue"] = $array[1];

if ($old > 100) {
 echo "</td><td class='update'>";
 echo "<b>". $old ."</b>";
} else {
 echo "</td><td class='value'>";
 echo $old;
}

【问题讨论】:

  • 我不明白旧值943-933=10的逻辑?为什么是 943?
  • @cmnardi 这只是一个例子。这个想法是我有值 X 和 Y,Y 是新值,X 是旧值。每次用户刷新页面时,我都需要计算差异。所以每次刷新后 Y 都会改变并变成 X 而 Y 是一个新值。

标签: php arrays session foreach session-cookies


【解决方案1】:

在循环之前将整个数组保存到会话中。

$_SESSION['old_values'] = $array;

然后你可以在循环时比较两个数组,并计算变化:

foreach ($array as $i => $value) {
    if (!($i % 2)) {
        echo '<tr><td class="value">' . $value . '</td>';
    } else {
        $change = 'x';
        if (isset($_SESSION['old_value'][$i])) {
            $change = $_SESSION['old_value'][$i] - $value;
        }
        echo '<td class="update">' . $change . '</td></tr>';
    }
}

无论如何,我认为有更好的方法来做你正在做的事情。例如,如果您的数组的结构如下所示,那就更可取了,而且复杂性要低得多:

[
    'Mike' => 933,
    'Josh' => 1245
]

测试

<table>
    <?php
    // Current data
    $array = ['Mike', 933, 'Josh', 1245];

    // Imagine the previous array was saved to the session:
    $_SESSION['old_value'] = ['Mike', 953, 'Josh', 1235];

    // Echo the table
    foreach ($array as $i => $value) {
        $even = !($i % 2);
        if ($even) {
            echo '<tr><td class="value">' . $value . '</td>';
        } else {
            $change = 'x';
            if (isset($_SESSION['old_value'][$i])) {
                $change = $_SESSION['old_value'][$i] - $value;
            }
            echo '<td class="update">' . $change . '</td></tr>';
        }
    }

    ?>
</table>

给予:

Mike   20
Josh  -10

【讨论】:

  • 感谢您的回答。我知道我的可能不是最简单的解决方案,但我只想要一个工作版本,然后再开始改进。关于您的代码,您走在正确的轨道上,但还没有完全到位。似乎第一个值保存在会话中,每次刷新都会将新值与原始值进行比较。因此,如果原始值为 900,下次刷新后为 905,则更改将显示 +5。好的。但是,如果我再次刷新并且值变为 907,则更改将显示 +7,但我需要它为 +2(在每次加载 X 变为 Y 并且 X 获得新值之后)。如果没有发生变化,它应该是 0。
  • 搞定了。必须添加 $_SESSION['old_value'][$i] = $value;到其他的结尾。谢谢!
  • 是的,对于您的第一个问题,我假设您每次都会更新会话,以便获得新的更改。它不应该永远保持原始值。
【解决方案2】:

在循环过程中,将所有值设置为一个数组,然后将该数组设置为您的 $_SESSION['old_values']。

然后为您的输出执行类似的操作。

$i = 0;
foreach($array as $value){
    $value = $value - $_SESSION['old_values'][$i];
    $i++;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-21
    • 2019-01-15
    • 2012-11-25
    • 2013-05-09
    • 2012-04-30
    • 2011-07-21
    • 2011-10-08
    • 1970-01-01
    相关资源
    最近更新 更多