Newsgroup: it.comp.www.php
Titolo: gestione delle sessioni tra php4 e php5

Buonasera,
sto riscontrando delle differenze nell'utilizzo delle sessioni tra il
php 4 e il php 5.
In locale utilizzo il php 5, ho delle sessioni così create:
$_SESSION['ordine'][1] = array('Prodotto1', '25');
$_SESSION['ordine'][2] = array('Prodotto2', '25');
$_SESSION['ordine'][3] = array('Prodotto3', '25');
foreach($_SESSION['ordine'] as $servizio){
	echo key($_SESSION['ordine']).' -- >'.$servizio[0].' --->
'.$servizio[1].'<br>';
	next($_SESSION['ordine']);
}
con questo foreach scorro tutti gli elementi di S_SESSION['ordine'], ad
ogni elemento riesco ad associare l'id, il nome e il relativo codice.
Questo stesso codice l'ho provato a pubblicare su php 4 e funziona in
maniera stranissima.
Alcune volte mi restituisce:
-------------
2 -- >Prodotto2 ---> 25
-- >Prodotto3 ---> 25
------------
Altre volte restitusce il risultato corretto
------------
1 -- >Prodotto1 ---> 25
2 -- >Prodotto2  ---> 25
3 -- >Prodotto3 ---> 25
------------
Non riesco a capire questo compartamento. Chi mi può aiutare?
P.S.
Il contenuto di print_r($_SESSION['ordine']) è sempre questo (quello
corretto):
Array ( [1] => Array ( [0] =>Prodotto1[1] => 25 ) [2] => Array ( [0] =>
Prodotto2 [1] => 25 ) [3] => Array ( [0] => Prodotto3 [1] => 25 ) )
Spero che mi possiate aiutarmi

 
Foreach scorre automaticamente tutti gli elementi di 
$_SESSION['ordine'], allora perchè usi anche next?
$a = array('a','b','c');
foreach($a as $val) {
	echo $val . "-";
}
[a-b-c-]
	Francesco

 [a-b-c-]
So come funziona il foreach. Il problema è un altro.
Se io ho una sessione di questo genere:
-----------
$_SESSION['ordine'][1] = array('Prodotto1', '25');
$_SESSION['ordine'][3] = array('Prodotto2', '25');
$_SESSION['ordine'][5] = array('Prodotto3', '25');
-----------
Con il foreach mi voglio ricavare:
1 (è l'indice dell'array, e rappresenta il codice del prodotto),
'Prodotto1' e '25
--------
foreach($_SESSION['ordine'] as $servizio){
        echo key($_SESSION['ordine']).' -- >'.$servizio[0].'
--->'.$servizio[1].'<br>';
        next($_SESSION['ordine']);
}
-------
Se non utilizzassi il next(), otterrei sempre:
------------
1 -- >Prodotto1 ---> 25
1 -- >Prodotto2  ---> 25
1 -- >Prodotto3 ---> 25
------------
L'indice è sempre 1, quindi con il next avanzo anche l'indice.
Comunque rimane il comportamento inspiegabile - almeno per me - di quel
codice.
Perchè in locale (php5) funziona perfettamente, mentre su un server
con php 4 no?

 'Prodotto1' e '25
<?php
$_SESSION['ordine'][1] = array('Prodotto1', '25');
$_SESSION['ordine'][3] = array('Prodotto2', '25');
$_SESSION['ordine'][5] = array('Prodotto3', '25');
foreach($_SESSION['ordine'] as $id => $servizio)
{
  echo $id.' --> '.$servizio[0].'--> '.$servizio[1].'<br>';
}
?>
Stampa a video:
 
1 --> Prodotto1 --> 25
3 --> Prodotto2 --> 25
5 --> Prodotto3 --> 25
È quello che volevi ottenere?
-- 
Federico

 ?>
che stupido, mi ero interstardito con il next() :(...
cmq mi sai dire perchè con il next non funziona? Così lo voglio
sapere per curiosità!!!
Grazie

 sapere per curiosità!!!
Beh, forse perchè liquidare con un "So come funziona il foreach. Il 
problema è un altro." oltre non essere molto educato non è tanto corretto.
Applicando un foreach sull'array $_SESSION['ordine'] scorri i valori 
dell'array $_SESSION['ordine'] (principale) e non del contenuto.
Ad ogni elemento di $_SESSION['ordine'] hai assegnato un array composto 
da 2 elementi, con il next saltavi l'indice, diciamo dispary dell'array 
sessione (praticamente facevi un for con uno step 2).
Nel tuo caso potevi fare un doppio foreach (inutile visto che, 
normalmente a priori sai quandi elementi è composto un elemento 
dell'array principale):
$_SESSION['ordine'][1] = array('Prodotto1', '25');
$_SESSION['ordine'][3] = array('Prodotto2', '25');
$_SESSION['ordine'][5] = array('Prodotto3', '25');
foreach ($_SESSION['ordine'] as $key=>$val) {
	foreach($val as $val_1) {
		echo $key . "->"$val_1 . "\n";
	}
}
1 ->Prodotto1
1 ->25
3 ->Prodotto2
etc...
	Francesco

 sessione (praticamente facevi un for con uno step 2).
forse non mi sono spiegato bene prima...perchè il next su php 5
funziona e sul 4 no?

 funziona e sul 4 no?
Tiro a caso (premesso che sul PHP Version 4.3.9 funziona!)
il foreach ha il proprio iteratore, mentre next e key hanno il medesimo 
iteratore; quindi alla fine, per il tuo codice, è corretto l'uso del 
next, insieme a key!
Con foreach scorri i valori, con key stampi la chiave che, se non usi il 
  next resta sempre posizionata sul primo elemento.
	Francesco

Il 29/10/06 11:51, [ Nicola ] ha scritto:

Nel tuo secondo post scrivi:
| Se io ho una sessione di questo genere:
| -----------
| $_SESSION['ordine'][1] = array('Prodotto1', '25');
| $_SESSION['ordine'][3] = array('Prodotto2', '25');
| $_SESSION['ordine'][5] = array('Prodotto3', '25');
| -----------
...
| foreach($_SESSION['ordine'] as $servizio){
|         echo key($_SESSION['ordine']).' -- >'.$servizio[0].'
| --->'.$servizio[1].'<br>';
|         next($_SESSION['ordine']);
| }
... 
| Se non utilizzassi il next(), otterrei sempre:
| ------------
| 1 -- >Prodotto1 ---> 25
| 1 -- >Prodotto2  ---> 25
| 1 -- >Prodotto3 ---> 25
| ------------
In realtà non è così. Il foreach a ogni ciclo fa avanzare in avanti di
una posizione il puntatore dell'array originale:
http://php.net/foreach
. Per questo motivo, per scorrere l'array usando
il foreach, non c'è bisogno di usare next().
<?php
$test = array('zero', 'uno', 'due');
foreach($test as $value) {
  // non faccio nulla
}
var_dump(current($test)); // Stampa bool(false)
?>
-- 
Federico