Fai un while.
Come fai con un FOR a leggere un array che probabilmente non avrà campi precisamente ordinati in modo crescente.
Ti faccio un esempio, nell'array nella session hai 0, 1, 2.
Il cliente cancella l'1 perchè non vuole più comprarlo, quindi in session ti rimane 0 e 2.
Se tu usassi il FOR andresti anche a pescare i dati di 1 che non esiste più (dando un errore di offset array).
Allora utilizza un while, combinando each e list.
Codice PHP:
reset ($_SESSION['shop']);
while (list ($chiave, $valore) = each ($_SESSION['shop'])) {
// $chiave è quello che ti serve, la stringa sotto ti darà la lista degli id dei prodotti in session
echo $_SESSION['shop'][$chiave]->id."
";
}