php estrazione random nomi e senza ripetizione

Domenico2013

Utente Attivo
6 Ago 2013
178
0
16
Buongiorno a tutti del forum, vorrei gentilmente un info: ho necessità di estrarre in maniera casuale e senza ripetizione del nome gia' estratto, di nomi contenuti o in un file di testo o in un database mysql (è indifferente). Qualcuno sa come fare? Grazie mille.
 

n1k4r0

Utente Attivo
15 Nov 2012
135
0
0
Ciao, potresti caricare tutti i nomi in un array e poi utilizzare array_rand per estrarli (se ho capito bene quello che vuoi)
 

Domenico2013

Utente Attivo
6 Ago 2013
178
0
16
Ciao n1k4r0....grazie per dritta, purtroppo array in questo modo estrae anche nomi già estratti...a me servirebbe estrazioni di nomi senza che si ripetano quelli già estratti. Grazie.
 

n1k4r0

Utente Attivo
15 Nov 2012
135
0
0
allora nella mia ignoranza io farei due array, nel secondo inserirei gli indici estratti dal primo e ad ogni nuova estrazione si controlla se l'indice è già stato estratto. ovviamente le estrazioni dalla lista andrebbero fatte con un ciclo for.
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Ciao, se usi un database dovrebbe bastarti questa query
Codice:
SELECT nome FROM tabella ORDER BY RAND() LIMIT 4
dove 4 e il numero di nomi estratti.
E' comunque interessante trovare una soluzione senza database.
 

n1k4r0

Utente Attivo
15 Nov 2012
135
0
0
allora questo il codice in php che dovrebbe fare quello che cerchi. i dati possono essere in un database, in un file di testo, in un xml o in un json, non ha importanza, l'importante è che riesci a raccoglierli in un array

PHP:
<?php
$nomi = array("mario","carlo","antonio","giuseppe","franco","dario","davide","ennio","daniele","francesa","roberta","luisa","franca","daniela","raffaella","marisa","marzia");
$indici = array();
$estratti = array();

$numero_nomi = 5; // nomi da estrarre dall'array
$tot_nomi = count($nomi) - 1; // numero totale dei nomi nell'array

for ( $i = 0; $i < $numero_nomi; $i++ ) {
  $ind = indiceCasuale($tot_nomi, $indici);
  $indici[] = $ind;
  $estratti[] = $nomi[$ind];
}

function indiceCasuale ($tn, $in) {
  $ind = rand(0, $tn);
  if ( in_array($ind, $in) ) {
    $ind = indiceCasuale ($tn, $in);
  }

  return $ind;
}
?>
<!DOCTYPE html>
<html>
  <head>
    <title>prova array casuale php</title>
  </head>
  <body>
    <?php print_r($estratti); ?>
  </body>
</html>

edit:
Se poi salvi gli indici estratti in una variabile di sistema hai la possibilità di ricordare i nomi già estratti anche ricaricando la pagina
 
Ultima modifica di un moderatore:

Domenico2013

Utente Attivo
6 Ago 2013
178
0
16
Ciao Grazie mille per il codice e disponibilità...il codice funziona bene, solo che ripete molte volte nomi già estratti...comunque il succo del post è l'estrazione in questo modo. qualche suggerimento per evitare l'estrazione di nomi già usciti? grazie,
 

n1k4r0

Utente Attivo
15 Nov 2012
135
0
0
è strano che il codice ripeta nomi già estratti a meno che non intendi quando ricarichi la pagina, in quel caso si ripete nomi già estratti ma si può ovviare con il codice che posto adesso

PHP:
<?php session_start();
$nomi = array("mario","carlo","antonio","giuseppe","franco","dario","davide","ennio","daniele","francesa","roberta","luisa","franca","daniela","raffaella","marisa","marzia");
if ( empty($_SESSION['indici']) ) $_SESSION['indici'] = array();
$estratti = array();

$numero_nomi = 5; // nomi da estrarre dall'array
$tot_nomi = count($nomi) - 1; // numero totale dei nomi nell'array
$diff = count($nomi) - count($_SESSION['indici']);

if ( $diff < $numero_nomi ) $numero_nomi = $diff;

if ( $numero_nomi > 0 ) {
  for ( $i = 0; $i < $numero_nomi; $i++ ) {
    $ind = indiceCasuale($tot_nomi, $_SESSION['indici']);
    $_SESSION['indici'][] = $ind;
    $estratti[] = $nomi[$ind];
  }
} else {
  $estratti = 'Nessun nome da estrarre';
}

function indiceCasuale ($tn, $in) {
  $ind = rand(0, $tn);
  if ( in_array($ind, $in) ) {
    $ind = indiceCasuale ($tn, $in);
  }

  return $ind;
}
?>
<!DOCTYPE html>
<html>
  <head>
    <title>prova array casuale php</title>
  </head>
  <body>
    <?php print_r($estratti); ?>
  </body>
</html>

questo codice ricorda gli estratti anche se ricarichi la pagina ed estrae tutti i nomi in blocchi da quanti vuoi tu con la variabile $numero_nomi fino a che li finisce.
in pratica ogni volta che ricarichi la pagina estrae 5 nomi sempre diversi.
 
Ultima modifica di un moderatore:

n1k4r0

Utente Attivo
15 Nov 2012
135
0
0
questo dovrebbe essere migliore, quando i nomi sono finiti mostra un avviso e se ricarichi la pagina ricomincia dall'inizio.

PHP:
<?php session_start();
if ( empty($_SESSION['nomi']) ) $_SESSION['nomi'] = array("mario","carlo","antonio","giuseppe","franco","dario","davide","ennio","daniele","francesa","roberta","luisa","franca","daniela","raffaella","marisa","marzia");
if ( empty($_SESSION['indici']) ) $_SESSION['indici'] = array();
$estratti = array();

$numero_nomi = 5; // nomi da estrarre dall'array
$tot_nomi = count($_SESSION['nomi']) - 1; // numero totale dei nomi nell'array
$diff = count($_SESSION['nomi']) - count($_SESSION['indici']);

if ( $diff < $numero_nomi ) $numero_nomi = $diff;

if ( $numero_nomi > 0 ) {
  for ( $i = 0; $i < $numero_nomi; $i++ ) {
    $ind = indiceCasuale($tot_nomi, $_SESSION['indici']);
    $_SESSION['indici'][] = $ind;
    $estratti[] = $_SESSION['nomi'][$ind];
  }
} else {
  $estratti = 'Nessun nome da estrarre';
  $_SESSION['indici'] = false;
}

function indiceCasuale ($tn, $in) {
  $ind = rand(0, $tn);
  if ( in_array($ind, $in) ) {
    $ind = indiceCasuale ($tn, $in);
  }
  return $ind;
}
?>
<!DOCTYPE html>
<html>
  <head>
    <title>prova array casuale php</title>
  </head>
  <body>
    <?php print_r($estratti); ?>
  </body>
</html>
 
Ultima modifica di un moderatore:

Domenico2013

Utente Attivo
6 Ago 2013
178
0
16
Ciao n1k4r0...grazie mille funziona alla perfezioneeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee. Posso chiederti solo una piccola chicca: è possibile caricare i nomi in questi codice prendendoli da un file di testo? Grazie :) :) :) :)
 

n1k4r0

Utente Attivo
15 Nov 2012
135
0
0
non mi hai detto com'è strutturato il file dei nomi comunque io presumo siano una serie di nomi separati da virgola

file nomi.txt
Codice:
mario,carlo,antonio,giuseppe,franco,dario,davide,ennio,daniele,francesa,roberta,luisa,franca,daniela,raffaella,marisa,marzia

file php
Codice:
<?php session_start();
if ( empty($_SESSION['nomi']) )  $_SESSION['nomi'] = explode(',', file_get_contents('nomi.txt'));
if ( empty($_SESSION['indici']) ) $_SESSION['indici'] = array();
$estratti = array();

$numero_nomi = 5; // nomi da estrarre dall'array
$tot_nomi = count($_SESSION['nomi']) - 1; // numero totale dei nomi nell'array
$diff = count($_SESSION['nomi']) - count($_SESSION['indici']);

if ( $diff < $numero_nomi ) $numero_nomi = $diff;

if ( $numero_nomi > 0 ) {
  for ( $i = 0; $i < $numero_nomi; $i++ ) {
    $ind = indiceCasuale($tot_nomi, $_SESSION['indici']);
    $_SESSION['indici'][] = $ind;
    $estratti[] = $_SESSION['nomi'][$ind];
  }
} else {
  $estratti = 'Nessun nome da estrarre';
  $_SESSION['indici'] = false;
}

function indiceCasuale ($tn, $in) {
  $ind = rand(0, $tn);
  if ( in_array($ind, $in) ) {
    $ind = indiceCasuale ($tn, $in);
  }
  return $ind;
}
?>
<!DOCTYPE html>
<html>
  <head>
    <title>prova array casuale php</title>
  </head>
  <body>
    <?php print_r($estratti); ?>
    <ul>
      <?php
      foreach ( $_SESSION['nomi'] as $k => $v ) {
        echo '<li';
        if ( ! empty($_SESSION['indici']) && in_array($k, $_SESSION['indici']) ) echo ' style="color: #a00;"';
        echo '>'.$v.'</li>';
      }
      ?>
    </ul>
  </body>
</html>
 

Domenico2013

Utente Attivo
6 Ago 2013
178
0
16
Ciao n1k4r0, grazie mille funziona tutto benissimoooooooooooooooooooooooo. Grazieeeeeeeeeeeeeeeeeeeeeee.
e' proprio quello che serve a me!!!!!!!!!!!!!!! non so come sdebitarmi :)
 

Domenico2013

Utente Attivo
6 Ago 2013
178
0
16
Ciao scusami ancora, come faccio a mettere questa porzione di codice in una tabella? grazie.

<?php

foreach ( $_SESSION['nomi'] as $k => $v ) {
echo '<li';
if ( ! empty($_SESSION['indici']) && in_array($k, $_SESSION['indici']) ) echo ' style="color: #a00;"';
echo '>'.$v.'</li>';
}


?>
 
Discussioni simili
Autore Titolo Forum Risposte Data
M [PHP] Estrazione random con nomi presi dal db PHP 22
L Estrazione dati php Database 6
D Chiave unica in estrazione dati da array php PHP 0
gandalf1959 Estrazione e visualizzazione del simbolo dell'euro php/mysqli PHP 0
creatorweb [PHP] estrazione ciclica dati con 2 dati alla volta PHP 2
O [PHP] problema estrazione immagine da db PHP 12
Gigi87 [PHP] Estrazione dati da forum o da social network PHP 1
V [PHP] Estrazione con SQL PHP 1
L estrazione dati da mysql in php e salvataggio in cartella del server PHP 51
E [PHP] estrazione dati in modo non continuativo PHP 1
S [PHP] estrazione dal DB complicata PHP 7
S Php e mysql, estrazione da una tabella e inserimento in un'altra tabella PHP 14
C [PHP][MY SQL] - Estrazione dati database tramite form PHP 8
G estrazione dati da DB tramite PHP errore time out PHP 2
G Script php estrazione email PHP 8
A Ricerca full text mysq ed estrazione con php PHP 8
F Cerco Hosting con VECCHIE versioni di php Hosting 0
Cosina Captcha php PHP 1
S passare un valore da un form a un file .php con metodo post PHP 4
N php msyql PHP 6
N php problemi a visualizzare video PHP 3
A menu a tendina php PHP 1
D protezione cartelle: blocco visualizzazione/scaricamento contenuto, ma abilitazione utilizzo dati da parte di file .php presenti sul sito Web Server 1
F Php date_diff PHP 1
K [PHP] Aggiungere caratteri ad una stringa in base alla lunghezza della stessa PHP 2
C Wp-admin a file php WordPress 5
Lino80 [Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress Offerte e Richieste di Lavoro e/o Collaborazione 0
csi Inviare file jpg in locale alla stampante con php PHP 0
M Passaggio variabili array php su un tasto jq PHP 3
E Php aggiornamento tabella PHP 9
G phpmailer e php 8.1 con estensione mysqli PHP 6
M Invio dati database via email php PHP 0
K [php] Problema con inner join PHP 4
K [php]form invio dati PHP 0
P Codifica caratteri speciali mysql php PHP 0
K [PHP] Problema con variabili concatenate. PHP 1
E Stampante termica escpos-php PHP 6
JeiMax Modifica codice php personalizzato PHP 2
G Come modificare un pdf in php PHP 1
U Link a doppio file PHP PHP 0
E PHP & jQuery PHP 8
N Passare array da php a javascript PHP 5
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
U PHP creare un file excel dopo ricerca nel DB PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
F Php e fatturazione elettronica PHP 0
P lanciare script asp (o php) da jquery Javascript 1
Couting95 inserire dati da un file di testo in una tabella in php PHP 1
P Data scraping in PHP non funziona PHP 4

Discussioni simili