[PHP] Poulesysteem... unset in array

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Eswip
  • Registratie: April 2005
  • Laatst online: 23-06-2024
Beste Tweakers...

Ik zit met het volgende probleem.
Ik ben een poule systeem aan het maken. Daarbij wil ik dat je met 1 druk op de knop, automatisch de poules kan indelen. Er is een table met daarin de teams die zich hebben aangemeld, en deze zijn ge-accepteerd. Aantal teams is altijd een meervoud van 4, omdat ik poules van 4 teams wil maken. Hoeveel poules kan ook worden ingesteld.

Ik heb hiervoor nu de volgende code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$clans = array();
$database->query('SELECT teamid FROM teams WHERE cupid='.$_GET['id'].' AND accepted=1');
while ($b = $database->fetch_assoc()) {
    $teams[] = $b;
}
shuffle($teams);
$poules = $a['teams'] / 4; //$a['teams'] wordt in een eerdere query uit de db gehaald.
for ($i=1; $i<=$poules; $i++) {
    $teamid = array_rand($teams, 4);
    $database->query('UPDATE teams SET poule='.$i.' WHERE teamid='.implode(' OR teamid=', $teamid).' ');
    foreach ($teamid as $c) {
        unset($team[$c]);
    }
}
?>De poules zijn ingedeeld.<?


Kort gezegd wat het doet. Hij gooit alle teams in een array. Hij berekend hoeveel poules er zijn. Dan pakt hij random 4 teams uit de array, en geeft deze een poule (nummer van de poule waar ze in zitten). Uiteindelijk haalt hij de 4 teams uit de array, en begint hij opnieuw.

Echter werkt dat unset niet helemaal heb ik het idee, want sommige teams krijgen geen poule...

Iemand die de fout weer?? :)

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Als unset niet zou werken, dan zouden sommige teams in meerdere poules ingedeeld worden lijkt me, en niet andersom. Weet je dus zeker dat het in unset zit? Doe onder je foreach eens een print_r($team)?

'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!

  • Eswip
  • Registratie: April 2005
  • Laatst online: 23-06-2024
-NMe- schreef op maandag 29 augustus 2005 @ 22:21:
Als unset niet zou werken, dan zouden sommige teams in meerdere poules ingedeeld worden lijkt me, en niet andersom. Weet je dus zeker dat het in unset zit? Doe onder je foreach eens een print_r($team)?
Dat klopt inderdaad...

Maar in de table teams, daar is een kolom, die heet poule.. die heeft een waarde van bv 1 (dat betekend dat hij in poule 1 zit)

Stel hij wordt niet uit de array gegooid, en hij komt weer lang, krijgt hij nu ineens poule 2, dus wordt zijn poule ge-update...


EDIT:

Nu doetie het wel goed... Kweet niet wat er de vorige keer fout ging. Misschien omdat ik alles hand matig in de database had gezet, dat daar misschien iets nog niet helemaal ok stond.

het ziet er nu iig naar uit dat het werkt!


EDIT 2:

Het werkt toch niet.. Op de site ziet alles er ok uit, maar als ik in de db kijk, zie ik dat bij 3 teams van 8 de kolom poule een waarde van NULL heeft.

En print_r gaf niets, was leeg...

[ Voor 28% gewijzigd door Eswip op 29-08-2005 22:33 ]


Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 21-09 10:10

WormLord

Devver

PHP:
1
2
3
    foreach ($teamid as $c) { 
        unset($team[$c]); 
    }

In $team staan de team id's als waarde en niet als index. Dus de unset die je hier gebruikt gooit de verkeerde teams weg.

Ehm, en je vult $teams terwijl je $team (dus zonder s) weer leeg maakt.

[ Voor 18% gewijzigd door WormLord op 30-08-2005 07:38 ]


Acties:
  • 0 Henk 'm!

  • Eswip
  • Registratie: April 2005
  • Laatst online: 23-06-2024
WormLord schreef op dinsdag 30 augustus 2005 @ 07:37:
PHP:
1
2
3
    foreach ($teamid as $c) { 
        unset($team[$c]); 
    }

In $team staan de team id's als waarde en niet als index. Dus de unset die je hier gebruikt gooit de verkeerde teams weg.

Ehm, en je vult $teams terwijl je $team (dus zonder s) weer leeg maakt.
dat laatste is idd ff een klein foutje...

Maar wat moet de unset dan wel zijn?

Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 21-09 10:10

WormLord

Devver

Oke, ik heb even de help van array_rand erbij gehaald en het blijkt dat je unset wel goed is 8)7 .
Echter geeft array_rand zoals jij het gebruikt een array met sleutel-waardes terug en niet met je team-ids. Je zal deze dus nog zelf moeten vertalen naar team-id's. Dus iets als:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$clans = array(); 
$database->query('SELECT teamid FROM teams WHERE cupid='.$_GET['id'].' AND accepted=1'); 
while ($b = $database->fetch_assoc()) { 
    $teams[] = $b; 
} 
shuffle($teams); 
$poules = $a['teams'] / 4; //$a['teams'] wordt in een eerdere query uit de db gehaald. 
for ($i=1; $i<=$poules; $i++) { 
    $teamid = array_rand($teams, 4); 
    foreach ($teamid as $c) { 
        $database->query('UPDATE teams SET poule='.$i.' WHERE teamid='.$teams[$c].' '); 
        unset($teams[$c]); 
    } 
} 
?>De poules zijn ingedeeld.<?

Acties:
  • 0 Henk 'm!

  • Eswip
  • Registratie: April 2005
  • Laatst online: 23-06-2024
WormLord schreef op dinsdag 30 augustus 2005 @ 11:18:
Oke, ik heb even de help van array_rand erbij gehaald en het blijkt dat je unset wel goed is 8)7 .
Echter geeft array_rand zoals jij het gebruikt een array met sleutel-waardes terug en niet met je team-ids. Je zal deze dus nog zelf moeten vertalen naar team-id's. Dus iets als:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$clans = array(); 
$database->query('SELECT teamid FROM teams WHERE cupid='.$_GET['id'].' AND accepted=1'); 
while ($b = $database->fetch_assoc()) { 
    $teams[] = $b; 
} 
shuffle($teams); 
$poules = $a['teams'] / 4; //$a['teams'] wordt in een eerdere query uit de db gehaald. 
for ($i=1; $i<=$poules; $i++) { 
    $teamid = array_rand($teams, 4); 
    foreach ($teamid as $c) { 
        $database->query('UPDATE teams SET poule='.$i.' WHERE teamid='.$teams[$c].' '); 
        unset($teams[$c]); 
    } 
} 
?>De poules zijn ingedeeld.<?
Heb je alleen wel weer wat meer queries, wat ik net zo vet pro had opgelost ;)

Maar ik zal er even naar kijken. Thnx iig.. Ik laat het wel weten als het gelukt is...

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Eswip:
Heb je alleen wel weer wat meer queries, wat ik net zo vet pro had opgelost ;)
't Kan stukken eenvoudiger.

Pseudo code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
do query "SELECT teamid FROM team WHERE accepted=1 AND cupid=x ORDER BY RAND()"

$i = 0;
$poules = array ();
while ( $row = fetch_assoc ) {
   $poule_nr = (int) ($i / 4);
   $poules[ $poule_nr ][]= $row [ 'teamid' ];
   if ( count ( $poules [ $poule_nr ] ) == 4 ) {
      // update teams.
   }
   $i ++;
}

Dat lijkt mij een stuk eenvoudiger en efficienter.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Eswip
  • Registratie: April 2005
  • Laatst online: 23-06-2024
Even terug komend op wormlord.. Jou code vind mysql niet leuk:

MySQL error:
We kunnen de volgende query niet uitvoeren op de database:
UPDATE teams SET poule=1 WHERE teamid=Array

Acties:
  • 0 Henk 'm!

  • Eswip
  • Registratie: April 2005
  • Laatst online: 23-06-2024
drm schreef op dinsdag 30 augustus 2005 @ 12:01:
[...]
't Kan stukken eenvoudiger.

Pseudo code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
do query "SELECT teamid FROM team WHERE accepted=1 AND cupid=x ORDER BY RAND()"

$i = 0;
$poules = array ();
while ( $row = fetch_assoc ) {
   $poule_nr = (int) ($i / 4);
   $poules[ $poule_nr ][]= $row [ 'teamid' ];
   if ( count ( $poules [ $poule_nr ] ) == 4 ) {
      // update teams.
   }
   $i ++;
}

Dat lijkt mij een stuk eenvoudiger en efficienter.
Alleen hoe wordt de query dan?? Ik kan redelijk wat php, maar van arrays snap ik nog steeds niet super veel :P

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Je query blijft gewoon hetzelfde? :?

'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!

  • Eswip
  • Registratie: April 2005
  • Laatst online: 23-06-2024
-NMe- schreef op dinsdag 30 augustus 2005 @ 12:40:
Je query blijft gewoon hetzelfde? :?
Ik heb het nu zo...

(even ge-echoed om te kijken wat hij voor een query wil uitvoeren.)

PHP:
1
2
3
4
5
6
7
8
9
10
11
$database->query('SELECT teamid FROM teams WHERE cupid='.$_GET['id'].' AND accepted=1 ORDER BY RAND()');
$i = 0;
$poules = array ();
while ($b = $database->fetch_assoc()) {
    $poule_nr = ((int)($i / 4))+1;
    $poules[$poule_nr][]=$b['teamid'];
    if (count($poules[$poule_nr])==4) {
        echo('UPDATE teams SET poule='.$poule_nr.' WHERE teamid='.implode(' OR teamid=', $poules).' ');
    }
    $i++;
}


Dit geeft de volgende error:

Notice: Array to string conversion in *****page.cupcp.php on line 145
UPDATE teams SET poule=1 WHERE teamid=Array
Notice: Array to string conversion in ****page.cupcp.php on line 145

Notice: Array to string conversion in /www/csnl/HTML/newsite/pages/page.cupcp.php on line 145
UPDATE teams SET poule=2 WHERE teamid=Array OR teamid=Array
De poules zijn ingedeeld.

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Eswip:
Alleen hoe wordt de query dan?? Ik kan redelijk wat php, maar van arrays snap ik nog steeds niet super veel :P
Dat vermoeden had ik al, ja. Die implode heb je zeker ook niet zelf bedacht?

Ik ga niet alles voor je voor zitten kauwen hoor, denk zelf ook maar een beetje na.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 21-09 10:10

WormLord

Devver

Eswip schreef op dinsdag 30 augustus 2005 @ 12:20:
Even terug komend op wormlord.. Jou code vind mysql niet leuk:

MySQL error:
We kunnen de volgende query niet uitvoeren op de database:
UPDATE teams SET poule=1 WHERE teamid=Array
Mijn code was dan ook meer bedoeld om aan te geven hoe je het resultaat van array_rand moet gebruiken, niet om jou het werk uit handen te nemen. Tip: doe eens een var_dump of print_r van de variabele die je gebruikt ($teams in je oorspronkelijke code of $poules in je laatste versie).
Eswip:
Alleen hoe wordt de query dan?? Ik kan redelijk wat php, maar van arrays snap ik nog steeds niet super veel
Dit lijkt me dan een goed moment om je daar eens wat in te verdiepen.

Acties:
  • 0 Henk 'm!

  • Eswip
  • Registratie: April 2005
  • Laatst online: 23-06-2024
Okee, ik heb het nu gevonden hoe het werkt met de array en als ik het echo ziet alles er ok uit:

UPDATE teams SET poule=1 WHERE teamid=9 OR teamid=6 OR teamid=8 OR teamid=10
UPDATE teams SET poule=2 WHERE teamid=7 OR teamid=1 OR teamid=4 OR teamid=5

Array ( [1] => Array ( [0] => 9 [1] => 6 [2] => 8 [3] => 10 ) [2] => Array ( [0] => 7 [1] => 1 [2] => 4 [3] => 5 ) ) De poules zijn ingedeeld.


Maar toen ik daad werkelijk de query ging uitvoeren, en in de database keek, zag ik dat er alleen 4 teams met poule 1 waren, en de teams die poule 2 zouden moeten hebben, waren leeg (NULL)

Iemand enig idee waarom?

De code
PHP:
1
2
3
4
5
6
7
8
9
10
11
$database->query('SELECT teamid FROM teams WHERE cupid='.$_GET['id'].' AND accepted=1 ORDER BY RAND()');
$i = 0;
$poules = array ();
while ($b = $database->fetch_assoc()) {
    $poule_nr = ((int)($i / 4))+1;
    $poules[$poule_nr][]=$b['teamid'];
    if (count($poules[$poule_nr])==4) {
        echo('UPDATE teams SET poule='.$poule_nr.' WHERE teamid='.implode(' OR teamid=', $poules[$poule_nr]).' ');
    }
    $i++;
}


Als ik de query echo en uitvoer, doet hij er maar 1 (voert er 1 uit, en print er 1). Als ik alleen maar echo, print hij er 2, en als ik alleen maar uitvoer dan doet hij er maar 1.

wtf?

[ Voor 63% gewijzigd door Eswip op 30-08-2005 13:48 ]


Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 21-09 10:10

WormLord

Devver

Misschien raakt je database object in de war door de tussentijdse queries, zodat je met
PHP:
1
while ($b = $database->fetch_assoc()) {
niet meer de juiste resultset benaderd?

Acties:
  • 0 Henk 'm!

  • Eswip
  • Registratie: April 2005
  • Laatst online: 23-06-2024
Met hulp van een vriend alsvolgt opgelost:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$database->query('SELECT teamid FROM teams WHERE cupid='.$_GET['id'].' AND accepted=1 ORDER BY RAND()');
$i = 0;
$poules = array ();
while ($b = $database->fetch_assoc()) {
    $poule_nr = ((int)($i / 4))+1;
    $poules[$poule_nr][]=$b['teamid'];
    $i++;
}

foreach ($poules as $poule_nr=>$teamids) {
    echo 'UPDATE teams SET poule='.$poule_nr.' WHERE teamid='.implode(' OR teamid=', $teamids));
}
Pagina: 1