PHP:Двумерный массив сеанса – отслеживание просмотренных продуктов

StackOverflow https://stackoverflow.com/questions/810003

Вопрос

Я пытаюсь создать массив для отображения последних 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 строчки.

  1. Нет необходимости в дополнительном array() вокруг array_unshift и array_pop.
  2. Когда вы используете array_unshift, вы нажимаете массив элементов (а не идентификаторы/коды по отдельности) - я думаю, вы имеете в виду 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" => $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]

Надеюсь, это поможет!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top