PHP:セッション2次元配列-表示された製品の追跡
-
03-07-2019 - |
質問
顧客が閲覧した最新の5つの製品を表示する配列を作成しようとしています。
配列は以下のような2次元配列です...
$ RView = array( array(ID = <!> gt; <!> quot; 1001 <!> quot ;, RefCode = <!> gt; <!> quot; Ref_01 <!> quot ;, Name = <!> gt; <!> quot; Name_01 <!> quot;)、 ... array(ID = <!> gt; <!> quot; 1005 <!> quot ;, RefCode = <!> gt; <!> quot; Ref_05 <!> quot ;, Name = <!> gt; <!> quot; Name_05 <!> quot;) );
配列値は製品レコードセットから取得され、顧客が製品ページにアクセスしたときに次のように機能するように設計されています。
- ページはセッション配列が存在するかどうかを確認します
- はいの場合、既存のセッションから配列変数が作成されます
いいえの場合、新しい配列が作成されます。 - 配列は新しい製品の詳細を追加します。
- 配列内に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>";
}
?>
解決
多かれ少なかれ、変更する必要があるのは2行だけです。
- array_unshiftとarray_popの周りに余分なarray()は必要ありません。
- array_unshiftを使用すると、アイテムの配列(個別にID /コードではない)をプッシュします-
array_unshift($RView, array($prodid,$name,...))
を意味すると思います
- $ RViewに5つの要素がない場合はどうなりますか?その場合、未定義の配列インデックスにアクセスしています(エラーが表示される場合と表示されない場合があります)。それをforeachループに変更します:例:
foreach ($Rview as $prod) echo $prod['Name']...
これらの変更を行った後に機能するはずです。ただし、コーディングスタイルを少しクリーンアップすることもできます。:)
編集:ああ、forループで配列を参照しているとき、配列に<!> quot; ProdID <!> quotがあることはわかりません。および<!> quot; Name <!> quot;インデックス。配列を作成するとき、= <!> gt;を使用してインデックスを定義する必要があります。演算子。
-
array_unshift:
のときに配列にインデックスを追加しますarray_unshift($RView, array("ProdID" => $row_rsProd["ProdID"], "Name"...))
-
row_rsProdが大きすぎない場合は、row_rsprod全体を$ RViewに追加するだけです。
array_unshift(...)を$RView[] = $row_rsProd
に変更します これにより、インデックスが保持されます。 - 代わりに、forループのインデックスを一致するように変更できます。現在、$ RViewにシフト解除する配列は0ベースです-$ RView [0] [0]は最初の製品の製品IDなどです。
したがって、foreachループの内容を
に変更できます。echo "<li>..." $prod[0] $prod[1] $prod[2]
役立つことを願っています!