Newsgroup: it.comp.www.php
Titolo: Eliminare "doppioni" in array multidimensionali

In realtà non è proprio come scritto in oggetto ma non sapevo come altro 
esprimermi. :)
Dunque ho un'array del tipo:
$a[0] = array(10.15,paperino,4444);
$a[1] = array(09.40,topolino,2222);
$a[2] = array(14.11,paperino,1111);
$a[3] = array(14.11,paperino,3333);
$a[4] = array(08.33,pluto,8888);
$a[5] = array(19.41,topolino,5555);
Dovrei ridurla eliminando tutte le righe che contengono lo stesso valore in 
una certa posizione.
Nell'elenco di cui sopra, vorrei eliminare i "doppioni" secondo l'indice 1
Il risultato cioè dovrebbe essere:
$a[0] = array(14.11,paperino,3333);
$a[1] = array(08.33,pluto,8888);
$a[2] = array(19.41,topolino,5555);
Grazie in anticipo. 

 Il risultato cioè dovrebbe essere:  [...]
Partendo dal presupposto che sia casuale o progressivo, il metodo più 
veloce dovrebbe essere il creare (o "duplicare") l'array usando come 
indice il valore che vuoi isolare:
$a[10.15] = array(10.15,paperino,4444);
$a[09.40] = array(09.40,topolino,2222);
$a[14.11] = array(14.11,paperino,1111);
$a[14.11] = array(14.11,paperino,3333);
$a[08.33] = array(08.33,pluto,8888);
$a[19.41] = array(19.41,topolino,5555);
Ovviamente così perdi l'indice progressivo, inoltre è da valutare se e 
quali cast applicare al valore che diverrà indice.

 elementi o è da considerarsi casuale?
Grazie per la risposta, il criterio c'è (evidentemente mi sono espresso 
male) nell'esempio
postato
$a[0] = array(10.15,paperino,4444);
$a[1] = array(09.40,topolino,2222);
$a[2] = array(14.11,paperino,1111);
$a[3] = array(14.11,paperino,3333);
$a[4] = array(08.33,pluto,8888);
$a[5] = array(19.41,topolino,5555);
il criterio è il nome che compare all'indice 1 di ogni riga (paparino, 
topolino, pluto).
Quindi vorrei che di quell'array di partenza se ne creasse un'altra 
eliminando i doppioni di quell'indice (dei nomi). Insomma, prendendo una 
riga per ogni nome diverso e quindi il risultato stando all'esempio sarebbe:
$a[0] = array(14.11,paperino,3333);
$a[1] = array(08.33,pluto,8888);
$a[2] = array(19.41,topolino,5555);
Spero d'aver reso meglio l'idea. 

 Spero d'aver reso meglio l'idea.
scusa non puoi ricrearti exnovo l'array ??? magari con un array di supporto 
dove son presenti i nomi gia utilizzati? 

 ha scritto nel messaggio 
news:4d73bfcb$0$6833$5fc...@news.tiscali.it...

oppure, ma avendolo usato pochissimo magari è un idea sballata, fai un for 
each di tutto l'array principale e, a parte il primo valore unsetti gli 
elementi
per intenderci (scritto molto maccheronico);
for ($i;$i=0;$i=$elementi)
$indice=$i;
$elemento=valore elemento da cancellare;
foreach ($arr as $elemento) {
    se elemento è diverso da quello dell'indice allora unset elemento 
dell'array
}

 $a[5] = array(19.41,topolino,5555);
abbozzo una possibile strategia:
1) creo un altro array ordinato secondo il campo da testare
2) ciclo su array comparando elemento corrente con quello successivo
se campi uguali rimuovo elemento successivo
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 topolino, pluto).
Questo era chiaro, il problema è capire secondo quale criterio scegliere 
una riga di "paperino" piuttosto che un'altra.
$a[0] = array(10.15,paperino,4444);
$a[2] = array(14.11,paperino,1111);
$a[3] = array(14.11,paperino,3333);
Quale di questi array ti serve? L'ultimo indicizzato? Uno a caso? Altro?
Comunque se utilizzi l'algoritmo che ti ho indicato in precedenza, 
sostituendo la chiave (usando il valore del secondo campo, io come 
esempio avevo usato il primo) dovresti ottenere il risultato voluto con 
le prestazioni migliori: se non puoi intervenire già in fase di 
creazione del primo array, devi fare solo una scansione dell'array e 
popolarne un secondo. Niente sort o altri algoritmi che inciderebbero 
sui tempi di elaborazione (tra l'altro su scala esponenziale).

 una riga di "paperino" piuttosto che un'altra.
Scusa, ho frainteso la tua risposta.
Comunque mi andrebbe bene prendere l'ultima delle ricorrenze che si 
presentano in lista.
Provo, intanto, a fare qualcosa seguendo i tuoi consigli. 

 se campi uguali rimuovo elemento successivo
Si, ero arrivato alla stessa conclusione, speravo in una sorta di funzione 
ad hoc ma pace.
Grazie a tutti. 

 presentano in lista.
Allora l'algoritmo è adeguato: sovrascrivendo i valori con lo stesso 
indice alla fine ti trovi con l'ultimo indicizzato.

 se campi uguali rimuovo elemento successivo
Attenzione però che con questa soluzione hai almeno:
tre array (sorgente, ordinato e uno, temporaneo, per la comparazione), 
un sort, una comparazione per ogni elemento dell'array, una rimozione di 
elemento (pesa parecchio se la fai, come presumo, sull'array temporaneo: 
ogni volta l'interprete deve reindicizzarlo).
Per array piccoli può andare ma le prestazioni non sono certo ottimali :-)

Nell'elenco di cui sopra, vorrei eliminare i "doppioni" secondo l'indice 1
Concettualmente potresti fare cosi':
	1. Estrarre la seconda "colonna":
		paperino, topolino, paperino, paperino, pluto...
	2. Combinare la seconda colonna con l'intero array:
		paperino => ( 10.15, paperino, 4444), topolino ...
	3. Eliminare i doppioni dall'array cosi' costruito (siccome e' un
	   array associativo, in realta' NON PUOI TENERLI i doppioni, non
	   e' un problema eliminarli
	4. Riottenere i soli valori di questo nuovo array.
Quindi:
	$ingressi = array_values(
			array_combine(
				array_map(function($a){ return $a[1]; },
				$ingressi),
			$ingressi));
Leonardo (S.E.&O. -- e richiede PHP5.x, credo)
-- 
Enough, enough!  But, stranger, ere we part,
Glancing farewell to each nefarious bier,
This warning would I beg you take to heart:
There is an end to e'en the worst career!