PDA

View Full Version : [PHP] Help rimozione duplicati array!!


ozzy19
21-02-2010, 18:52
Salve a tutti!! Ho questo codice che crea una lista password random,vorrei impostare un controllo che verifica che non vengano create password duplicate!
Questo è il pezzo di codice in php:


$npass=10; //sequenza di password
$nchar=1; //numero caratteri



for ($i=0; $i<=$npass; $i++){


$m = getPassword($nchar, false, false, true, false);


//QUI VOGLIO IMPOSTARE IL CONTROLLO CHE IL VALORE CREATO
// NON SIA UGUALE AL PRECEDENTE! come faccio??
echo $m ."<br/>";



}

bobbytre
21-02-2010, 20:02
Salve a tutti!! Ho questo codice che crea una lista password random,vorrei impostare un controllo che verifica che non vengano create password duplicate!
Questo è il pezzo di codice in php:


$npass=10; //sequenza di password
$nchar=1; //numero caratteri



for ($i=0; $i<=$npass; $i++){


$m = getPassword($nchar, false, false, true, false);


//QUI VOGLIO IMPOSTARE IL CONTROLLO CHE IL VALORE CREATO
// NON SIA UGUALE AL PRECEDENTE! come faccio??
echo $m ."<br/>";



}


cosi' controlli che il valore non sia uguale al precedente
$npass=10; //sequenza di password
$nchar=1; //numero caratteri


$old_dati = null;

for ($i=0; $i<=$npass; $i++)
{

$m = getPassword($nchar, false, false, true, false);

//QUI VOGLIO IMPOSTARE IL CONTROLLO CHE IL VALORE CREATO
// NON SIA UGUALE AL PRECEDENTE! come faccio??
echo $m ."<br/>";

if( $old_dati == $m )
{
echo "valore uguale al precendete \n";
}

$old_dati = $m ;

}


ma non risolvi se devi controllare con i valori precedenti , in qual caso come minimo ti servirebbero 2 for innestati per controllare ogni password con tutte le altre ( anche se non è la migliore soluzione )

ozzy19
21-02-2010, 22:39
cosi' controlli che il valore non sia uguale al precedente
$npass=10; //sequenza di password
$nchar=1; //numero caratteri


$old_dati = null;

for ($i=0; $i<=$npass; $i++)
{

$m = getPassword($nchar, false, false, true, false);

//QUI VOGLIO IMPOSTARE IL CONTROLLO CHE IL VALORE CREATO
// NON SIA UGUALE AL PRECEDENTE! come faccio??
echo $m ."<br/>";

if( $old_dati == $m )
{
echo "valore uguale al precendete \n";
}

$old_dati = $m ;

}


ma non risolvi se devi controllare con i valori precedenti , in qual caso come minimo ti servirebbero 2 for innestati per controllare ogni password con tutte le altre ( anche se non è la migliore soluzione )

Ciao!! ma la variabile old_dati, è null! come fa a controllarlo col precedente?
E poi come farei per i for innestati?

bobbytre
21-02-2010, 23:35
Ciao!! ma la variabile old_dati, è null! come fa a controllarlo col precedente?
E poi come farei per i for innestati?

all'inizio, quando $i == 0 , non ci sono valori precedenti quindi è NULL ( o puoi un qualsiasi altro valore vuoi che abbia all'inizio),

poi quando $i sara' uguale a 1 , $old_dati contiene il valore di $m di quando ancora $i era uguale a 0 ,

poi quando $i è uguale a 2 , $old_dati contiene il valore di $m di quando $i era uguale a 1 , e cosi via ...



riguardo ai for , intendevo qualcosa tipo questo, che puo' andare bene per valori di $npass piccoli

for($i=0;$i<$npass;$i++)
{
$p1 = getPassword($i);
for($j=$i+1;$j<=$npass;$j++)
{
$p2 = getPassword($j);

if( $p1 == $p2 )
{
echo "trovata una password già usata";
}
}

}

ozzy19
22-02-2010, 11:19
Ho provato sia con $old_dati che con i for innestati, ma non ottengo il risultato desiderato!!:(

bobbytre
22-02-2010, 12:52
Ho provato sia con $old_dati che con i for innestati, ma non ottengo il risultato desiderato!!:(

forse ho capito , il tuo getPassoword non prende delle password salvate da qualche parte e le ritorna ma le crea nuove , giusto ?

se fosse cosi risolvi



$pwds = array();

for ($i=0; $i<=$npass; $i++)
{

$m = getPassword();

if( in_array($m , $pass) )
{
echo "esiste \n";
}
else
{
echo "non esiste \n";
$pwds[] = $m ;
}

}
print_r($pwds);

ozzy19
22-02-2010, 14:41
Ora va meglio!! però io l'ho adattato così, senza che mi stampi esiste o non esiste, faccio stampare solo i valori diversi degli array, solo che quando li stampa alcuni output sono così:



i
n
u
q

s
f

p
v
x
t

m







h
r

c
z


Cioè mi escono degli spazi vuoti dell'array, sicuramente perche ho usato la funzione array_unique per eliminare i duplicatidall'array, ora come faccio a generare altre password per quegli spazi vuoti? oppure come faccio a generare una lista di password, senza specificare la sequenza(il numero di pass da creare), cioè il programma si deve bloccare solo quando ha creato tutte le combinazioni possibili!! Nel caso mio ad esempio(sopra le lettere minuscole dell'alfabeto) dovrebbe stampare tutte le lettere dell'alfabeto dalla a alla z senza duplicati e poi si deve bloccare, perchè naturalmente si creano successivamente doppioni!(La funzione per creare le combinazione ce l'ho, però penso che basterà giocare con il ciclo for giusto?). Questo è il codice che mi ha prodotto l'output di sopra:


$npass=25; //sequenza di password
$nchar=1; //numero caratteri



$pwds = array();

for ($i=0; $i<=$npass; $i++){

$m = getPassword($nchar, true, false, false, false);





if( in_array($m , $pass) )
{

}
else
{

$pwds[] = $m ;
}





}
$result = array_unique($pwds);


for ($j=0; $j<=$npass; $j++){
echo $result[$j]."<br/>" ;

}

bobbytre
22-02-2010, 16:07
Ora va meglio!! però io l'ho adattato così, senza che mi stampi esiste o non esiste, faccio stampare solo i valori diversi degli array, solo che quando li stampa alcuni output sono così:



i
n
u
q

s
f

p
v
x
t

m







h
r

c
z


Cioè mi escono degli spazi vuoti dell'array, sicuramente perche ho usato la funzione array_unique per eliminare i duplicatidall'array, ora come faccio a generare altre password per quegli spazi vuoti? oppure come faccio a generare una lista di password, senza specificare la sequenza(il numero di pass da creare), cioè il programma si deve bloccare solo quando ha creato tutte le combinazioni possibili!! Nel caso mio ad esempio(sopra le lettere minuscole dell'alfabeto) dovrebbe stampare tutte le lettere dell'alfabeto dalla a alla z senza duplicati e poi si deve bloccare, perchè naturalmente si creano successivamente doppioni!(La funzione per creare le combinazione ce l'ho, però penso che basterà giocare con il ciclo for giusto?). Questo è il codice che mi ha prodotto l'output di sopra:


$npass=25; //sequenza di password
$nchar=1; //numero caratteri



$pwds = array();

for ($i=0; $i<=$npass; $i++){

$m = getPassword($nchar, true, false, false, false);





if( in_array($m , $pass) )
{

}
else
{

$pwds[] = $m ;
}





}
$result = array_unique($pwds);


for ($j=0; $j<=$npass; $j++){
echo $result[$j]."<br/>" ;

}




la funzione array_unique mi sembra iutile , perche gia' tutti i valori dentro all'array sono unici per il modo in cui è stato riempito.

ozzy19
23-02-2010, 22:03
Grazie a tutti! ho risolto con java!!!:D