Newsgroup: it.comp.www.php
Titolo: Estrazione di coppie chiave/valore dall'array

Ipotizziamo di aver un array, il quale ha le chiavi espresse non come indici 
numerici, ma come valori letterali.
Se io voglio visualizzare un preciso elemento di quell'array (ad esempio il 
terzo) e nessun altro, ma non so il suo valore letterale di chiave, cosa 
devo fare?
rob4you

"rob4you" <KIED...@KIEDIMELO.it> ha scritto nel messaggio 
news:RfPrg.2043$I22....@tornado.fastwebnet.it...

forse queste funzioni ti possono essere utili.
http://it2.php.net/manual/it/function.reset.php
Con reset metti il puntatore dell'array al primo elemento, e con next lo fai 
muovere in avanti.
ciao,
Luca(riello) 

rob4you ha scritto:

Per sapere la chiave potresti usare
http://it2.php.net/manual/it/function.array-keys.php
Per sapere direttamente il valore
http://it2.php.net/manual/it/function.array-values.php

 
http://it2.php.net/manual/it/function.array-values.php
Utili funzioni di sicuro, ma non in questo caso: trovare (ad esempio) la 
TERZA coppia chiave/valore dell'array (e io non so cosa c'è in questo array 
[ad esempio a causa di un ordinamento che mi cambia il posizionamento 
iniziale]).
A questo proposito, la soluzione finora migliore è quella proposta da 
Luca(riello), di usare la funzione current(), in abbinamento alle funzioni 
next() e reset(). Non sembra una soluzione ottimale da un punto di vista 
computazionale...però è l'unica che finora è uscita da questo thread.
rob4you 

 fai muovere in avanti.
In effetti questa potrebbe essere una soluzione funzionante, anche se 
ovviamente sembrerebbe non proprio ottimale (immagina un array di cinquemila 
elementi, e io vorrei conoscere l'elemento numero 4500, dovrei ciclare 
invocando la funzione next() per 4500 volte!).
E' un peccato (ma ovviamente da altri punti di vista un pregio) che con gli 
array associativi si perda l'indicizzazione numerica, perchè in tal caso per 
conoscere l'elemento in posizione 4500 basterebbe porre: $array[4500].
rob4you 

 ciclare invocando la funzione next() per 4500 volte!).
Non penso ci sia altra via... la stavo cercando anch'io!
A parte ovviamente riprogettare il tutto magari con Array multidimensionali.
L'unica "ottimizzazione" che credo si possa fare e scegliere se posizionare 
il puntatore all'inizio o alla fine dell'array e procedere di conseguenza 
con un next() o con prev().
ciao,
Luca(riello) 

> 
http://it2.php.net/manual/it/function.array-values.php
forse donnie e' stato un po sintetico...  ti serviva forse questo?
<?php
$my_pos=4; //posizione dell'array che mi interessa
$arr=array( "prova1"=>"uno",
      "prova2"=>"due",
      "prova3"=>"tre",
      "prova4"=>"quattro",
      "prova5"=>"cinque",
      "prova6"=>"sei",
      "prova7"=>"sette"
     );
$keys=array_keys ($arr);
$my_key=$keys[$my_pos];
$my_val=$arr[$my_key];
echo "Alla posizione $my_pos c'e' la chiave $my_key con il valore $my_val";
?>
oppure se vuoi utilizzare anche la funzione array_values
<?php
$my_pos=4;//posizione dell'array che mi interessa
$arr=array( "prova1"=>"uno",
      "prova2"=>"due",
      "prova3"=>"tre",
      "prova4"=>"quattro",
      "prova5"=>"cinque",
      "prova6"=>"sei",
      "prova7"=>"sette"
     );
$keys=array_keys ($arr);
$values=array_values($arr);
$my_key=$keys[$my_pos];
$my_val=$values[$my_pos];
echo "Alla posizione $my_pos c'e' la chiave $my_key con il valore $my_val";
?>

> forse donnie e' stato un po sintetico...  ti serviva forse questo?
 [CUT]
direi che è geniale!!!! :-))
grazie davvero....peccato solo che per risolvere il problema si ha la 
necessità di allocare un altro array...
rob4you 

 necessità di allocare un altro array...
Ma così non è peggio scusa? Per un array grosso come dicevi tu devi 
riempirne uno altro altrettanto grande.
ciao,
Luca(riello)

 riempirne uno altro altrettanto grande.
E infatti....è il problema a cui alludevo io.
Il mio "entusiasmo" iniziale era stato presto moderato da questa 
perplessità. :-)
Ma secondo te, l'uso di next() nell'esempio nostro, è piu o meno efficiente 
di:
//ipotizzo di avere un array di 5000 elementi $array
$i=0;
$posizione=4500;
foreach($array as $chiave => $valore){
        if($i<$posizione) { $i++; continue; }
        echo "Nella posizione $i c'è la coppia: $chiave/$valore";
}
rob4you 

 perplessità. :-)
scusa,ma quella di non dichiarare un altro array non l'avevo vista :O
io avrei fatto:
 $i=0;
$posizione=4500;
foreach($array as $chiave => $valore)
{
    if($i==$posizione)
        break;
    else
         $i++;


        break;


 pensandoci , forse anche cosi'...  LOL
Che dite di questa?
Dovrebbe essere la più performante. E' una idea... sinceramente non sono 
troppo sicuro del codice anche se l'ho testato e funziona... forse ci si può 
ancora lavorare per renderla più snella, ma che volete? l'italia ha appena 
vinto i mondiali :)
<?php
$posizione= 3;
$array= Array(0,1,2,3,4,5,6,7,8,9,10,11,12,13);
$dim= count($array);
if($posizione>$dim/2) {
    end($array);
    for($i=$dim-1; $i>$posizione+1; $i--) {
        prev($array);
    }
     $miovalore= ($posizione==$dim-1)? current($array) : prev($array);
}
else {
    reset($array);
    for($i=1; $i<$posizione; $i++) {
        next($array);
    }
    $miovalore= ($posizione==0)? current($array) : next($array);
}
echo $miovalore;
?>
PS: Campioni del mondo :)



Quello che chiedi non ha senso. Un array con indici letterali (senza un
ordinamento alfabetico sugli indici, per esempio) e` a tutti gli effetti
una tabella hash, che per definizione non ha un ordine.
L'elemento che ora e` terzo, dopo un inserimento potrebbe essere quarto,
o rimanere terzo. O il sistema potrebbe anche riallocare tutto e fartelo
trovare primo. Non puoi saperlo perche` non esiste un ordine.
-- 
Alessandro Pellizzari

 una tabella hash, che per definizione non ha un ordine.
La domanda non esclude quell'ipotesi (l'ordine alfabetico sugli indici).
Comunque, anche se non penso mi serva ma prima o poi potrà servire, hai la 
fonte per questa affermazione?
ciao,
Luca(riello) 

 fonte per questa affermazione?
Per ora PHP implementa gli array come "ordinati" nel senso che aggiunge
sempre alla fine:
http://it.php.net/manual/en/language.types.array.php
An array in PHP is actually an ordered map. A map is a type that maps
values to keys. This type is optimized in several ways, so you can use
it as a real array, or a list (vector), hashtable (which is an
implementation of a map), dictionary, collection, stack, queue and
probably more. Because you can have another PHP array as a value, you
can also quite easily simulate trees.
Ma cio` non toglie che in futuro, per ottimizzarne la gestione o per
memorizzarli in DB o chissa` che altro, il comportamento passa cambiare.
Bye.
-- 
Alessandro Pellizzari

 una tabella hash, che per definizione non ha un ordine.
Invece io il senso lo trovo:
ti faccio un esempio banalissimo (a titolo esplicativo):
1) le chiavi dell'array sono degli username alfanumerici (o solo numerici se 
preferisci);
2) i valori dell'array indicano dei punteggi (numerici).
Io ordino l'array in base ai valori numerici, in ordine crescente.
Voglio estrarre il decimo classificato, voglio quindi conoscere il suo 
username e il suo punteggio, cioč voglio conoscere la chiave e il valore.
Mi sfugge qualcosa o l'esempio č lineare e ha senso?
rob4you


Grazie :-)
Ciao,
Luca(riello) 

 
Sintetico è a dir poco :-P
non avevo letto che si trattava di grandi array e che c'era il problema 
della memoria utilizzata...
a questo punto, visto che sono un niubbo mi sorge una domanda...
per controllare il tempo di esecuzione o la memoria utilizzata da una 
parte di uno script php si devono utilizzare le "differenze"
microtime (dopo) - microtime (prima)
e
memory_get_usage (dopo) - memory_get_usage (prima)
o c'è qualcosa di migliore da utilizzare?
Grazie

 vinto i mondiali :)
CAMPIONI DEL MONDOOOOOOOOOO
CAMPIONI DEL MONDOOOOOOOOOOOOOOOOOO
Lo so che è brutto "urlare", ma quando serve... serve! :-P

On Sat, 8 Jul 2006 16:25:47 +0200, "rob4you" <KIED...@KIEDIMELO.it>
wrote:

array_slice($arr, $pos-1, 1)?
Leonardo forse
-- 
Dawn is near, the time is short (Human aircraft! Hard to port!)
We eight reindeers of the night work as one in silent flight.
Let not one damn house pass by (Who taught that guy how to fly?)
Each year sees more girls and boys: how many of them can we bring toys?