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.
 
Ciao, potresti caricare tutti i nomi in un array e poi utilizzare array_rand per estrarli (se ho capito bene quello che vuoi)
 
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.
 
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.
 
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.
 
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:
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,
 
è 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:
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:
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 :) :) :) :)
 
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>
 
Ciao n1k4r0, grazie mille funziona tutto benissimoooooooooooooooooooooooo. Grazieeeeeeeeeeeeeeeeeeeeeee.
e' proprio quello che serve a me!!!!!!!!!!!!!!! non so come sdebitarmi :)
 
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