Pagina 1 di 1

Problema cancellazione elemento array

Inviato: 02/04/2010, 10:12
da agron_92
Ciao a tutti,
E' da un po' che programmo in php, e devo dire che fino ad ora mai avuto grossi problemi, però ora mi trovo di fronte a questo dilemma:
Vorrei far vedere a random (nella variabile $a con valori da 0 a 51) 8 elementi diversi tra loro dell'array $carte, per fare questo dovrei cancellare ad ogni ciclo l'elemento dell'array stampato, ho provato a farlo mediante la funzione iniziale che ho trovato in rete che ho denominato array_cancella che non mi ha portato a nessun risultato, ho provato anche alla fine del ciclo for ad associare a NULL l'elemento dell'array, però non funziona nulla dato che ad ogni volta che stampo i valori a volte me li fa visualizzare doppi!
Il codice è questo:

Codice: Seleziona tutto

function array_cancella($array, $item) {
    if (isset($array[$item])){
    unset($array[$item]);
    }
return array_merge($array);
}
    
$n = 0;
for ($n=0; $n<9; $n++){    
$carte = array("AC", "2C", "3C", "4C", "5C", "6C", "7C", "8C", "9C", "DC", "JC", "QC", "KC",
               "AQ", "2Q", "3Q", "4Q", "5Q", "6Q", "7Q", "8Q", "9Q", "DQ", "JQ", "QQ", "KQ",
               "AF", "2F", "3F", "4F", "5F", "6F", "7F", "8F", "9F", "DF", "JF", "QF", "KF",
               "AP", "2P", "3P", "4P", "5P", "6P", "7P", "8P", "9P", "DP", "JP", "QP", "KP");
$a = rand(0, 51);
$carta[$n] = $carte[$a];
    if ($n == 0){
    print ("1 - $carta[$n] ");
    } else {
        if ($n == 1){    
        print ("$carta[$n] <br />");
        } else {
            if ($n == 2){
            print ("2 - $carta[$n] ");
            } else {
                if ($n == 3){    
                print ("$carta[$n] <br />");
                } else {    
                    print ("$carta[$n] ");
                }
            }
        }
    }
$carte = array_cancella($carte, $a);
$carte[$a] = NULL;
}
 
Potreste darmi un consiglio? Grazie in anticipo. :)

Re: Problema cancellazione elemento array

Inviato: 02/04/2010, 11:38
da Carlo
Allora, presuppongo che l'array da cui vuoi rimuovere l'elemento, sia l'array $carte, giusto?

Beh, allora potresti crearti questa funzione, che in modalità random, prende un elemento dell'array, e poi lo elimini dall'array.

Codice: Seleziona tutto

function _rand($array) {
    global $$array;
    
    $rand = rand(0, count($$array));
    unset($$array[$rand]);
    return $rand;
} 
L'uso è molto semplice. Tu li passi sottoforma di stringa il nome dell'array, calcola gli elementi, estra un elemento random, lo toglie dall'array, ed infine l'elemento random lo ritorna.

Uso:

Codice: Seleziona tutto

$carta_estratta = _rand('carte'); 
P.S.: Calcola però che il rand() lo devi iniziare da 0 e non da 1, perchè il primo elemento dell'array ha come chiave 0.

Re: Problema cancellazione elemento array

Inviato: 02/04/2010, 14:40
da agron_92
Grazie per la risposta, cmq ora non riesco a visualizzare l'elemento perchè c'è l'unset prima di visualizzarlo inoltre io ne devo far visualizzare 9 di elementi e non vorrei che il random per sbaglio possa riprendere una cifra già uscita in precedenza che mi becca proprio la casella dell'array a cui ho già dato l'unset, per questo nel codice al primo post avevo inserito anche un array_merge($array), in modo che mi shifta l'elemento dell'array cancellato. Esempio

Codice: Seleziona tutto

$array = array("A", "B", "C", "D");
print_r($array); // Array ( [0] => A [1] => B [2] => C [3] => D )
unset($array[2]); // elimina la c, svuota il secondo elemento
array_merge($array); // shifta il secondo elemento
print_r($array); // Array ( [0] => A [1] => B [3] => D )   
Il problema è quando faccio il ciclo, sembra che questo non funzioni proprio

Codice: Seleziona tutto

unset($array[$item]); 
array_merge($array); 
visto che si ripetono più volte le stesse "carte" invece io posso farne visualizzare solo una, perchè non possono esserci carte doppie in un mazzo.
Quasi quasi penso che la soluzione sarebbe non lavorare nell'array ma nel numero che restituisce il random in modo che non si ripeta più di una volta...

Re: Problema cancellazione elemento array

Inviato: 02/04/2010, 17:02
da Carlo
Questa non andrebbe bene?

Codice: Seleziona tutto

function _rand($array, $items) {
    global $$array;
    $return = array();
    
    for($i = 0; $i <= $items; $i++) {
        $rand = rand(0, count($$array));
        $return[] = $rand;
        unset($$array[$rand]);
    }
    
    return $return;
} 
Uso:

Codice: Seleziona tutto

$carta_estratta = _rand('carte', 9); 

Comunque non ho capito a che serve questa riga:

Codice: Seleziona tutto

array_merge($array); // shifta il secondo elemento 

Re: Problema cancellazione elemento array

Inviato: 02/04/2010, 19:11
da agron_92
carlino1994 ha scritto:Comunque non ho capito a che serve questa riga:

Codice: Seleziona tutto

array_merge($array); // shifta il secondo elemento   
In effetti ora che ho fatto delle prove ho visto che l'unset elimina del tutto l'elemento incluso l'indice, io pensavo che l'indice rimaneva ed il valore andava a NULL per questo ho aggiunto la funzione array_merge. Ma è inutile in questo caso anche perchè l'ho applicata in modo scorretto.

Con il tuo metodo va bene solo che ho trovato questa soluzione ancora più semplice con l'uso dell' array_splice

Codice: Seleziona tutto

for ($n=0; $n<9; $n++) {
    $rand = rand(0, count($carte) - $n);
    list(carta) = array_splice($carte, $rand, 1);
    echo $carta, "<br />";
} 
Grazie dei buoni consigli. ;)

Re: Problema cancellazione elemento array

Inviato: 02/04/2010, 21:26
da Carlo
Comunque l'uso della funzione array_merge() era errato.

1) La funzione doveva essere assegnata ad una variabile, il cui contiene l'array output del merge.
2) Devi passarli più di un'array, poichè la funzione serve per unire due o più array in un unico array.