PHP:Двумерный массив сеанса – отслеживание просмотренных продуктов
-
03-07-2019 - |
Вопрос
Я пытаюсь создать массив для отображения последних 5 продуктов, просмотренных клиентом.
Массив представляет собой двумерный массив, как показано ниже...
$ Rview = array (array (id => "1001", refcode => "ref_01", name => "name_01"), ...Array (id => "1005", RefCode => "Ref_05", name => "name_05"));
Значения массива извлекаются из набора записей продуктов и предназначены для работы следующим образом, когда клиент посещает страницу продукта.
- Страница проверит, существует ли массив сеансов.
- Если да, переменная массива создается из существующего сеанса.
Если нет, создается новый массив. - Массив добавит информацию о новом продукте.
- Массив будет учитываться, если в массиве более 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() вокруг array_unshift и array_pop.
- Когда вы используете array_unshift, вы нажимаете массив элементов (а не идентификаторы/коды по отдельности) - я думаю, вы имеете в виду
array_unshift($RView, array($prodid,$name,...))
- Что, если $RView не имеет 5 элементов?В этом случае вы получаете доступ к неопределенным индексам массива (которые могут показывать или не показывать ошибку).Измените его на цикл foreach:например
foreach ($Rview as $prod) echo $prod['Name']...
Это должно работать после внесения этих изменений.Возможно, вам захочется немного подчистить стиль кодирования :)
РЕДАКТИРОВАТЬ:О, я понимаю, когда вы ссылаетесь на массив в цикле for, он не знает, что у массива есть индексы «ProdID» и «Name».Когда вы создаете массив, вам необходимо определить индексы с помощью оператора =>.
Добавьте индексы в массив при использовании 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] — это идентификатор продукта для первого продукта и т. д.
Таким образом, вы можете изменить материал в цикле foreach на
echo "<li>..." $prod[0] $prod[1] $prod[2]
Надеюсь, это поможет!