[PHP] Random nummers koppelen aan gebruikers

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • cdl
  • Registratie: Mei 2003
  • Laatst online: 25-07 12:05
Op phpfreakz.nl had ik al een topic geopend met m'n vraag, maar dit leverde nog weinig op. Ook op GoT zijn betrekkelijk weinig topics hierover. Ik zit met het volgende probleem.

Ik ben dus bezig met het opzetten van een klein toernooi-scriptje. In m'n database staan m'n teams die zich aangemeld hebben voor een bepaald toernooi. Door middel van een loting-script wil ik ze een plek geven in de poules. In de database moet dus een veld aan een gebruiker toegevoegd worden dat z'n plaats in één van de poules moet voorstellen. Bijv:
1 staat voor plaats 1 in poule A
2 staat voor plaats 2 in poule A
3 staat voor plaats 3 in poule A
4 staat voor plaats 4 in poule A
5 staat voor plaats 1 in poule B
6 staat voor plaats 2 in poule B
enz.

Nou kwam ik op php.net een scriptje tegen dat een reeks nummers genereert:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
// set some globals 
$s = array(); 
$n = 32; // the range you require 

function set_num() { 
  global $s, $n; 
  $add = "yes"; 
  $ran = rand(1, $n); 
  if(count($s) > 0) { 
   foreach($s as $sh) { 
     if($ran == $sh) { 
       $add = "no"; 
     } 
   } 
  } 
  if($add == "yes") { 
   $s[] = $ran; 
  } else { 
   set_num(); 
  } 
} 

// call the function as needed 
while(count($s) < $n) { 
  set_num(); 
} 
// just output a list seperated by whitespace 
foreach($s as $sh) { 
  echo $sh."&nbsp;"; 
} 
?>


In dit geval worden de nummers 1 t/m 32 willekeurig achter elkaar gezet, leuk voor een soort van loting zeg maar.

Hoe kan ik nou zo'n nummer aan een gebruiker in m'n database koppelen? Het kan natuurlijk zijn dat er meer dan 32 gebruikers zich ingeschreven hebben voor het toernooi. Moet je dan de 32 teams die zich als eerst ingeschreven hebben uit de database halen, het nummer koppelen aan de teams en dan de velden in MySql updaten? (dit kan want de datum & tijd van inschrijving staan genoteerd). Kan iemand mij misschien helpen?

Dat zeg ik!


Acties:
  • 0 Henk 'm!

  • 4VAlien
  • Registratie: November 2000
  • Laatst online: 24-06 09:47

4VAlien

Intarweb!

Als je een array uit de database ophaalt met het user id dan krijg je in php een array met (b.v.) 32 elementen en elk user_id kan je dan uit die array halen en koppelen aan het random number.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Die global $n is sowieso slecht, als je dat nou eens gewoon met een parameter deed is het al een stukken beter script. Verder sluit ik me aan bij mijn bovenbuur.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • cdl
  • Registratie: Mei 2003
  • Laatst online: 25-07 12:05
Ok, da's wel duidelijk. Ik begrijp de bedoeling alleen qua kennis van PHP ben ik nog echt een beginner. Ik heb dus ook geen flauw idee hoe ik dat in een script moet omzetten. Ik weet dat ik in principe alles op php.net kan vinden maar ik vind het fijn om alles al testende uit te proberen.

edit:

ik zit een beetje te goochelen hier maar heb dus de arrays van de userID's uit m'n database kunnen halen:

PHP:
1
2
3
4
5
6
7
8
9
10
<?php

$query = "SELECT unumber FROM users"; //unumber zijn de userID's
$result = mysql_query($query);

while ($row = mysql_fetch_array($result)){
    echo $row["unumber"] , " " , "<BR> \n";
    }

?>


Hij laat ze dus ook netjes zien. De vraag is dus hoe ik nu die 32 gegenereerde nummers kan koppelen aan de userID's?

[ Voor 40% gewijzigd door cdl op 13-03-2004 01:03 ]

Dat zeg ik!


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Kan ook natuurlijk meteen MySQL het werk laten doen:

PHP:
1
$query = "SELECT DISTINCT unumber FROM users ORDER BY BY RAND() LIMIT 32;";


Heb je ze meteen gerandomized. En distinct zorgt ervoor dat niet 2x dezelfde recordset wordt opgehaald.

--
En anders is een array_combine misschien iets.

[ Voor 22% gewijzigd door Grijze Vos op 13-03-2004 01:25 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • cdl
  • Registratie: Mei 2003
  • Laatst online: 25-07 12:05
Vind ik net een topic op phpfreakz.nl van iemand met hetzelfde probleem, van 3 dagen geleden nog wel 8)7

http://www.phpfreakz.nl/forum.php?forum=4&iid=387528

Hier de code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php
error_reporting(E_ALL);
  
//aantal teams bepalen tbv random hernummering 
$query = mysql_query("SELECT COUNT(1) as 'aantal' 
FROM users") or die(mysql_error()); 

$nrows = mysql_num_rows($query); 
if ($nrows < 0) 
    { 
    echo "geen records gevonden"; 
    } 
    else 
    { 
    while ($row = mysql_fetch_assoc($query)) 
        { 
        $aantal = $row['aantal']; 
        } 
    } 

// set some globals 
$s = array(); 
$n = $aantal; // aantal unieke waardes die random gekozen worden 

function set_num() { 
  global $s, $n; 
  $add = "yes"; 
  $ran = rand(1, $n); 
  if(count($s) > 0) { 
   foreach($s as $sh) { 
     if($ran == $sh) { 
       $add = "no"; 
     } 
   } 
  } 
  if($add == "yes") { 
   $s[] = $ran; 
  } else { 
   set_num(); 
  } 
} 


//[het volgende doet de truc!] 
for ($i=1; $i<=$n; $i++) 
    { 
        set_num(); 
        foreach($s as $sh) { 
      mysql_query("UPDATE users SET upnumber=$sh WHERE unumber = $i") or die(mysql_error()); 
    } 

    } 

?>

Dat zeg ik!


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
datzelfde kan dus ook binnen 7 regels code.

[edit]
hier:
PHP:
1
2
3
4
5
6
7
$n = 32;
$i = 0;
$query = mysql_query("SELECT DISTINCT unumber FROM users ORDER BY BY RAND() LIMIT $n;");
while ($row = mysql_fetch_assoc($query)) 
{ 
  mysql_query("UPDATE users SET upnumber=" . $i++ . " WHERE unumber = " . $row["unumber"]); 
}


Hmz, mn schatting van 7 regels was wel errug accuraat. :D
De maker van dat bovenstaande scriptje mag zich overigens wat mij betreft even diep gaan schamen, want hij heeft er heel weinig van begrepen. Die globals is een duidelijk voorbeeld daarvan.

[ Voor 87% gewijzigd door Grijze Vos op 13-03-2004 02:52 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info

Pagina: 1