phpBB Italia chiude!
phpBB Italia ringrazia tutti gli utenti che hanno dato fiducia al nostro progetto per ben 9 anni, e che, grazie al grande lavoro fatto da tutto lo Staff (rigorosamente a titolo gratuito), hanno portato il portale a diventare il principale punto di riferimento italiano alla piattaforma phpBB.

Purtroppo, causa motivi personali, non ho più modo di gestirlo e portarlo avanti. Il forum viene ora posto in uno stato di sola lettura, nonché un archivio storico per permettere a chiunque di fruire di tutte le discussioni trattate.

Il nuovo portale di assistenza per l'Italia di phpBB diventa phpBB-Store.it, cui ringrazio per aver deciso di portare avanti questo grande progetto.

Grazie ancora,
Carlo - Amministratore di phpBB Italia

Problema cancellazione elemento array

Area di discussione relativa al linguaggio di programmazione web più conosciuto. Il forum è dedicato anche a MySQL, la piattaforma di database più utilizzata con il PHP.
Rispondi
Avatar utente
agron_92
Utente
Utente
Messaggi: 8
Iscritto il: 12/11/2009, 19:42
Versione: 3.0.7-PL1
Server: UNIX/Linux
Contatta:

Problema cancellazione elemento array

Messaggio da agron_92 » 02/04/2010, 10:12

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. :)
Immagine

Avatar utente
Carlo
Amministratore
Amministratore
Messaggi: 9957
Iscritto il: 19/04/2009, 10:24
Sesso: Maschio
Versione: 3.2.0
Server: UNIX/Linux
PHP: 7.1.0
Database: MySQL(i) 10.0.27-MariaDB-cll-lve
Località: Puglia
Contatta:

Re: Problema cancellazione elemento array

Messaggio da Carlo » 02/04/2010, 11:38

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.
MODs | Stili | Traduzioni MOD
Ogni MP contenente una richiesta di supporto verrà ignorato.

Avatar utente
agron_92
Utente
Utente
Messaggi: 8
Iscritto il: 12/11/2009, 19:42
Versione: 3.0.7-PL1
Server: UNIX/Linux
Contatta:

Re: Problema cancellazione elemento array

Messaggio da agron_92 » 02/04/2010, 14:40

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...
Immagine

Avatar utente
Carlo
Amministratore
Amministratore
Messaggi: 9957
Iscritto il: 19/04/2009, 10:24
Sesso: Maschio
Versione: 3.2.0
Server: UNIX/Linux
PHP: 7.1.0
Database: MySQL(i) 10.0.27-MariaDB-cll-lve
Località: Puglia
Contatta:

Re: Problema cancellazione elemento array

Messaggio da Carlo » 02/04/2010, 17:02

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 
MODs | Stili | Traduzioni MOD
Ogni MP contenente una richiesta di supporto verrà ignorato.

Avatar utente
agron_92
Utente
Utente
Messaggi: 8
Iscritto il: 12/11/2009, 19:42
Versione: 3.0.7-PL1
Server: UNIX/Linux
Contatta:

Re: Problema cancellazione elemento array

Messaggio da agron_92 » 02/04/2010, 19:11

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. ;)
Immagine

Avatar utente
Carlo
Amministratore
Amministratore
Messaggi: 9957
Iscritto il: 19/04/2009, 10:24
Sesso: Maschio
Versione: 3.2.0
Server: UNIX/Linux
PHP: 7.1.0
Database: MySQL(i) 10.0.27-MariaDB-cll-lve
Località: Puglia
Contatta:

Re: Problema cancellazione elemento array

Messaggio da Carlo » 02/04/2010, 21:26

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.
MODs | Stili | Traduzioni MOD
Ogni MP contenente una richiesta di supporto verrà ignorato.

Rispondi

Torna a “PHP - MySQL”

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti