【问题标题】:PHP: Session 2-Dimensional Array - Track Viewed ProductsPHP:会话二维数组 - 跟踪查看的产品
【发布时间】:2010-10-23 00:57:03
【问题描述】:

我正在尝试创建一个数组来显示客户最近查看的 5 个产品。

数组是一个二维数组,如下所示...

$RView= 数组( 数组(ID =>“1001”,RefCode =>“Ref_01”,名称 =>“Name_01”), ... 数组(ID =>“1005”,RefCode =>“Ref_05”,名称 =>“Name_05”) );

数组值是从产品记录集中检索的,旨在在客户访问产品页面时按以下方式运行。

  • 页面将检查会话数组是否存在
  • 如果是,则从现有 Session 创建一个数组变量
    如果否,则创建一个新数组。
  • Array 将添加新产品详细信息。
  • 如果阵列中的现有产品超过 5 个,则阵列将被计算在内。
  • 如果是,它将删除最旧的。
    如果否,则进行下一步。
  • 从修改后的数组创建/更新会话。

我目前的努力附在下面...
非常感谢您的帮助。

    <?php 
    session_start() 
    // Get or Create Array
    IF (isset($_SESSION['sessRView'])) {
    $RView = ($_SESSION['sessRView']); } 
    ELSE {
    $RView = array(array()); 
    }

    // Append currently viewed Product to Array
    array(array_unshift($RView, $row_rsPrd['PrdID'], $row_rsPrd['RefCode'], $row_rsPrd['Name']));

    // Check if more than 5 products exist in Array, if so delete.
    IF (sizeof($RView) > 5) {
    array(array_pop($RView)); }

    // Update Session for next page
    $_SESSION['sessRView'] = $RView;

    // Display Array
    for ($row = 0; $row < 5; $row++)
    {
    echo "<ul>";
        echo "<li><a href='?PrdID=".$RView[$row]["PrdID"]."'>".$RView[$row]["RefCode"]."</a> : ".$RView[$row]["Name"]."</li>";
    echo "</ul>";
    }
    ?>

【问题讨论】:

    标签: php arrays session multidimensional-array


    【解决方案1】:

    或多或少是对的 - 只需要更改 2 行。

    1. array_unshift 和 array_pop 周围不需要额外的 array()。
    2. 当您使用 array_unshift 时,您正在推送一组项目(而不是单独的 id/代码) - 我认为您的意思是 array_unshift($RView, array($prodid,$name,...))
    3. 如果 $RView 没有 5 个元素怎么办?在这种情况下,您正在访问未定义的数组索引(可能会或可能不会显示错误)。将其更改为 foreach 循环:例如
      foreach ($Rview as $prod) echo $prod['Name']...

    进行这些更改后它应该可以工作。不过,您可能想稍微清理一下编码风格:)


    编辑:哦,我明白了,当您在 for 循环中引用数组时,它不知道该数组具有“ProdID”和“Name”索引。当你创建一个数组时,你必须使用 => 操作符来定义索引。

    • array_unshift 时为数组添加索引:
      array_unshift($RView, array("ProdID" =&gt; $row_rsProd["ProdID"], "Name"...))

    • 如果 row_rsProd 不是太大,您可以将整个 row_rsprod 粘贴到 $RView 上。
      所以将 array_unshift(...) 更改为 $RView[] = $row_rsProd
      这样索引就被保留了。

    • 或者,您可以更改 for 循环中的索引以匹配。现在,您取消转移到 $RView 的数组是基于 0 的 - $RView[0][0] 是第一个产品的产品 ID,等等。
      因此,您可以将 foreach 循环中的内容更改为
      echo "&lt;li&gt;..." $prod[0] $prod[1] $prod[2]

    希望有帮助!

    【讨论】:

    • 感谢您的帮助。我已经进行了您建议的更改(我认为),但我无法显示数组中的值。我刚刚得到 5 个项目符号 HTML 列表。我所做的更改是... array_unshift($RView, array($row_rsPrd['PrdID'], $row_rsPrd['RefCode'], $row_rsPrd['Name'])); -- IF (sizeof($RView) > 5) { array_pop($RView); } -- foreach ($RView as $prod) { echo "”; ;} 知道有什么问题吗?
    • 感谢您的帮助。
      我已经做出了您建议的更改(我认为),但我无法显示数组中的值。我刚刚得到 5 个项目符号 HTML 列表。
      我所做的更改是...

      array_unshift($RView, array($row_rsPrd['PrdID'], $row_rsPrd['RefCode'], $row_rsPrd['Name']));
      --

      IF (sizeof($RView) > 5)
      { array_pop($RView); }
      --

      foreach ($RView as $prod) {
      echo "”;
      ;}

      知道有什么问题吗?
    • 抱歉上面的文字乱七八糟,但要么我遗漏了什么,要么无法使用“添加评论”以可读格式写出回复。
    • 感谢您提供更多信息。您的第一个要点解决方案成功了。 array_unshift($RView, array("PrdID" => $row_rsPrd['PrdDetID'], "RefCode" => ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2016-11-10
    相关资源
    最近更新 更多