Newsgroup: it.comp.www.php
Titolo: funzione che restituisce più valori

Sto provando a fare un'esercitazione in cui una funzione viene richiamata e 
restituisce più valori tramite un array. Purtroppo però non riesco a farla 
funzionare, perché non ho ben capito come gestire l'array restituito al di 
fuori della funzione.
Ecco il codice, non fate troppo caso ai commenti bizzarri, come commenti dei 
commenti... :-) :
<?php
/* questo test non ha molto senso, ma serve per capire il passaggio di più 
variabili dalle funzioni.
Passaggio che non avviene correttamente, perchè?
Il test dà in output :
1973nome //corretto
1973pwd // corretto
// ed ecco l'errore in output:
Il nome utente è: (qui non compare il valore)
La password utente è: (qui non compare il valore)
*/
$id = 1973;
function prendi_username_password($user_id){
echo ($username = $user_id."nome<br />");
echo ($password = $user_id."pwd<br />");
return ($array_dati = array("nome_utente" => $username, "password_utente" => 
$password));
}
$array_dati = prendi_username_password($id);
echo "Il nome utente è: $array_dati[0].<br />";
echo "La password utente è: $array_dati[1].";
?>
ciao Sirdalud 

 $array_dati[0].<br />"; echo "La password utente è: $array_dati[1].";
Se passi un array associativo, devi leggerlo come un array associativo, 
quindi $array_dati['nome_utente'] e non $array_dati[0].
Io di solito faccio cosi`:
function blabla()
{
 ...
 return array($valore1, $valore2);
}
list($v1, $v2) = blabla();
Cosi` ho in $v1 e $v2 i valori restituiti.
Bye.

 Bye.
Ciao,
è vero, l'array è associativo ed io lo trattavo come un array con i soli 
valori.
Dunque, ho provato a fare come mi hai detto tu, ma non mi funziona, nel 
senso che continua a darmi i valori vuoti. Ecco il codice:
<?php
$id = 1973;
function prendi_username_password($user_id){
echo ($username = $user_id."nome<br />");
echo ($password = $user_id."pwd<br />");
return ($array_dati = array("nome_utente" => $username, "password_utente" =>
$password));
}
list($user, $pass) = prendi_username_password($id);
echo "Il nome utente è: $user<br />";
echo "La password utente è: $pass";
?>
*****************************
Nel modo in cui lo avevo impostato, dopo la tua giusta osservazione 
sull'array associativo, ho impostato il codice e mi  funziona, Eccolo:
<?php
$id = 1973;
function prendi_username_password($user_id){
echo ($username = $user_id."nome<br />");
echo ($password = $user_id."pwd<br />");
return ($array_dati = array("nome_utente" => $username, "password_utente" =>
$password));
}
$array_dati = prendi_username_password($id);
echo "Il nome utente è: $array_dati[nome_utente]<br />";
echo "La password utente è: $array_dati[password_utente]";
?>
*****************************
Infine ho fatto un'altra prova, utilizzando list each, e pare che funzioni 
anche quella combinazione, anche se vorrei chiederti come è possibile. 
Intanto ecco il codice, e di seguito il commento:
<?php
$id = 1973;
function prendi_username_password($user_id){
echo ($username = $user_id."nome<br />");
echo ($password = $user_id."pwd<br />");
return array("nome_utente" => $username, "password_utente" => $password);
}
list(,$username) = each($array_dati);
list(,$password) = each($array_dati);
echo "Il nome utente è: $username<br />";
echo "La password utente è: $password";
?>
Commento: mi ricordavo la costruzione list each che avevo studiato un tempo 
su un vecchio libro di php (il libro che ho riposto perché troppo vecchio e 
che ho sostituito con l'attuale, un po' più aggiornato), però la applicavo 
ad un ciclo while, come di seguito:
$mio_array = array("banana","mela","pera");
// spero di scrivere bene il ciclo perché non sono molto pratico
while (list(,$valore) = each ($mio_array){
echo "frutto: $valore<br />\n";
}
e qui mi torna perché è un ciclo che scorre l'array, ma nel precedente caso 
non uso un ciclo ma l'interprete si comporta come se stesse passando da un 
elemento dell'array a quello successivo in ordine sequenziale, secondo come 
è stato impostato all'interno della funzione: cioè prima il nome utente e 
poi la password. E' una mia idea oppure funziona proprio così? Ricordo un 
concetto di testina di lettura che si sposta, questo ne è un esempio?
PS: in verità devo sempre affrontare gli array sul libro in cui sto 
studiando, per il momento li ha soltanto accennati e non ha fatto menzione 
ancora di quelli associativi, per questo mi muovo con cautela.
ciao Sirdalud 

Ops! Ho dimenticato un pezzo di codice (commentato sotto). Lo riscrivo 
completo e funzionante.
<?php
$id = 1973;
function prendi_username_password($user_id){
echo ($username = $user_id."nome<br />");
echo ($password = $user_id."pwd<br />");
return array("nome_utente" => $username, "password_utente" => $password);
}
$array_dati = prendi_username_password($id); // avevo dimenticato questa 
parte.
list(,$username) = each($array_dati);
list(,$password) = each($array_dati);
echo "Il nome utente è: $username<br />";
echo "La password utente è: $password";
?>
Appunto chiedevo come viene letto l'array, in ordine sequenziale in base a 
come è stato impostato dentro la funzione?
ciao Sirdalud

 ?>
Nella mia crassa ignoranza:
echo "Il nome utente è: $array_dati['nome_utente']<br />";
echo "La password utente è: $array_dati['password_utente']";
Altrimenti ti funziona lo stesso ma produce un warning nei log.

 Altrimenti ti funziona lo stesso ma produce un warning nei log.
Ah sì, vero, ho dimenticato gli apici.
ciao Sirdalud 

 Bye.
Ciao, nel frattempo ho provato nuovamente il tuo esempio, ed ho constatato 
che funziona per gli array ma non per quelli associativi.
------------>
Infatti:
function blabla()
{
 return array($valore1, $valore2);
}
list($v1, $v2) = blabla();
funziona
-------------<
------------->
mentre:
function blabla()
{
 return array($chiave1 => $valore1, $chiave2 => $valore2);
}
list($v1, $v2) = blabla();
non funziona
------------<
Cosa ne pensi? Ti risulta?
ciao Sirdalud

 sposta, questo ne è un esempio?
Si`, piu` o meno e` il concetto giusto.
Non e` necessario usare cicli espliciti per processare un array. Oppure, 
se ti suona meglio, considera anche "each" come un ciclo che processa 
tutti gli elementi dell'array.
In PHP gli array sono una cosa un po' particolare.
Sono degli array sequenziali, a cui puoi dare indici numerici.
Sono array associativi, a cui puoi dare indici alfanumerici, e l'ordine 
dipende dalla sequenza di inserimento.
Sono delle tabelle hash, per cui a un id corrisponde un valore, e puoi 
accederci in tempo O(1).
Sono degli oggetti (o meglio, dei proto-oggetti perche` non implementano 
tutte le caratteristiche degli oggetti) che implementano diverse 
interfacce della SPL (quelle che servono per usarli con each e foreach, 
per esempio, o con isset, count, ecc.).
In pratica racchiudono in un'unica struttura dati quello che in altri 
linguaggi si fa con 5-6 strutture diverse.
Bye.