PHP массив будет зацикливаться только на две строки, впоследствии перезаписывая вторую строку / индекс - PullRequest
0 голосов
/ 08 декабря 2011

Я получаю сообщение POST FORM и на нажатой (отправленной) кнопке есть значение (первичный ключ) элемента в базе данных ($ artid).

Для каждого из этих POST я пытаюсь добавить новое значение объекта в массив, сопоставленный с ключом, установленным $ artid, поэтому он должен быть уникальным. Массив добавляется в $ _SESSION, чтобы каждый раз выводить один и тот же массив.

Первый объект добавляется нормально, но другие объекты просто перезаписывают вторую позицию в массиве. Мне нужно, чтобы он продолжал расти.

Код:

if (!isset($_SESSION['itemArray'])) {
    ...
    $cartArr = array();
    $bookitem = new BookItem($artid, $qty, $price);
    $cartArr[$artid] = $bookitem;

    $_SESSION['itemArray'] = $cartArr;

    foreach($cartArr as $key => $obj) { ....   }
}
else {
    $cartArr = $_SESSION['itemArray'];
    if (array_key_exists($artid, $cartArr)) {
        $cartArr[$artid]->quantity = $qty; 
    }
    else {
        $bookitem = new BookItem($artid, $qty, $price);
        $cartArr[$artid] = $bookitem;
    }
    foreach($cartArr as $key => $obj) { ...   } 
}

Заранее спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 08 декабря 2011

Не похоже, что вы устанавливаете массив Session обратно после добавления нового элемента. Поэтому при следующей загрузке страницы новое значение не было сохранено.

У вас есть 2 варианта:

1) после установки foreach $_SESSION['itemArray'] = $cartArr; это сохранит все изменения (например, добавление нового элемента) в сеансе.

2) Присвойте $cartArr ссылку на $_SESSION['itemArray'], чтобы любые изменения, сделанные в $cartArr, были действительно внесены в $_SESSION['itemArray'] Это можно сделать $cartArr =& $_SESSION['itemArray']; сразу после else

1 голос
/ 08 декабря 2011

Не могли бы вы подробнее рассказать о том, что происходит в вашем foreach? Вы присваиваете свойства класса своему массиву?

Кроме того, вы можете попробовать сериализовать ваш массив, прежде чем присваивать ему значение сеанса.

Если все остальное терпит неудачу, это обычно помогает мне понять, где я иду не так:

print_r($cartArr);

Удачи!

EDIT: Посмотрев на другой ответ, я понял, что также упустил возможность раннего присвоения вашей переменной сеанса. Вам нужно будет назначить это после каждого foreach, или, как сказал Бен, - работа, выполненная вашим foreach, не будет продолжена. (Хотя я бы все равно сериализовал массив)

...