LS,

Voor een nieuwe versie van mijn scorelijst op mijn hangman spel wil ik met drie arrays tegelijk werken om
1. vanuit de $score_tables - array een tabelnaam op te halen waarmee ik met een SELECT in de database de hoogste scores zal ophalen.
De gebruiker zal deze naam niet in het scherm zien.
2. vanuit de $categories - array de categorienaam van een tabel op te halen om aan de gebruiker te tonen.
3. de $word_amount[] - array met behulp van de uitkomst van de query te vullen.

Uiteindelijk moet de tabel die op het scherm getoond moet worden er zo uitzien:

[m.b.v. $categories] || [m.b.v. $word_amount]
UIT DE TYCOON NEWSPAPER || 876
CONTAMINATIES || 57
ONBESTAANDE BEROEPEN || 122
LEUK WOORD VOOR GALGJE -MOEILIJK- || 104
etc.

In plaats daarvan wordt het volgende getoond, op basis van de huidige code die ik nu heb:
[m.b.v. $categories] || [m.b.v. $word_amount]
UIT DE TYCOON NEWSPAPER || 876
CONTAMINATIES || 876
ONBESTAANDE BEROEPEN || 57
LEUK WOORD VOOR GALGJE -MOEILIJK- || 57
etc.

Probleem waar het op stuk loopt:
Variable $iSize telt de inhoud van de array $word_amount 2x!
Zou array $word_amount 14 records bevatten, dan wordt $iSize op 28 gezet, etc.

Eigen poging om het op te lossen staat in de code onder '// Mijn poging'.
Maar levert als resultaat dat er inderdaad de helft zoveel regels wordt afgedrukt, maar nog altijd met opeenvolgend elke waarde uit $word_amount 2x.

Hieronder mijn code en daaronder de url naar de betreffende live-pagina. Mocht er nog meer info wenselijk zijn dan hoor ik het graag.

<?php
// ****************************************************************************************
// GET SCORE PER CATEGORY FOR THIS CRIMINAL *
// ****************************************************************************************
// Per categorie de score ophalen van deze crimineel
// ****************************************************************************************
foreach ($score_tables as $table)
{
$sql_times_hangman = "SELECT COUNT( `best` ) FROM `$table` WHERE `best` = '$criminal'";
$result = mysql_query($sql_times_hangman) or die(mysql_error());
if($localmode === true)
{
$adminqueries .=
"<br>SQL hoogste score van crimineel in categorie " . $table . ": " .
$sql_times_hangman . "<br>";
}

$word_amount[] = $amount;
while ($line = mysql_fetch_array($result, MYSQL_ASSOC))
{
foreach ($line as $amount)
{
array_push($word_amount, $amount);
echo $amount . "<br>";
}
}
}

// ****************************************************************************************
// SHOW COLUMS WITH SCORE DETAILS *
// ****************************************************************************************
// Weergave van score
// ****************************************************************************************

$iSize = count($word_amount) >= count($categories) ? count($word_amount) : count($categories);

// Mijn poging :
// $iSize = ($iSize / 2);

for ($i = 0; $i < $iSize; $i++)
{
echo
'<tr><td>'.(isset($categories[$i]) ? $categories[$i] : '&nbsp;').'</td>
<td>'.(isset($word_amount[$i]) ? $word_amount[$i] : '&nbsp;').'</td></tr>';
}


// ****************************************************************************************
?>

URL: http://www.wsnoi.com/index.php?page=oldhangman

Vast bedankt voor het meedenken!

Groeten,

Gsorsnoi

Toevoeging de twee arrays $score_tables & $categories:

<?php
// ****************************************************************************************
// CREATE SCORE TABLES ARRAY *
// ****************************************************************************************

$score_tables = array(

1 => "hangman",
2 => "hang_contaminaties",
3 => "hang_onbest_beroep",
4 => "hang_leuk_hard",
5 => "hang_marten_toonder",
6 => "hang_medisch",
7 => "hang_nost_kindertv",
8 => "hangman_pokemon",
9 => "hang_geletrui",
10 => "hang_basket",
11 => "hang_emoties",
12 => "hang_wii",
13 => "hang_auto",
14 => "hang_overdebijbel"
);
// ****************************************************************************************
// CREATE AVAILABLE CATEGORY ARRAY *
// ****************************************************************************************
$categories = array(

1 => "UIT DE TYCOON NEWSPAPER",
2 => "CONTAMINATIES",
3 => "ONBESTAANDE BEROEPEN",
4 => "LEUK WOORD VOOR GALGJE -MOEILIJK-",
5 => "MARTEN TOONDER",
6 => "MEDISCHE WERELD",
7 => "NOSTALGISCHE KINDER TV",
8 => "POKEMON",
9 => "GELE TRUIDRAGERS",
10 => "NBA BASKETBALLSPELERS",
11 => "EMOTIONELE TOESTANDEN",
12 => "WII GAMES",
13 => "AUTOMERKEN",
14 => "OVER DE BIJBEL"
);
?>
Bedankt SanThe. Die binnenste loops waren inderdaad niet nodig.

Dit is wat ik nu heb. Ben inmiddels aardig ver gekomen:

<?php
// ****************************************************************************************
// GET SCORE PER CATEGORY FOR THIS CRIMINAL *
// ****************************************************************************************
// Per categorie de score ophalen van deze crimineel
// ****************************************************************************************
$occ = 0;
foreach ($score_tables as $table)
{
$sql_times_hangman = "SELECT COUNT( `best` ) AS `$occ` FROM `$table` WHERE `best` = '$criminal'";
$result = mysql_query($sql_times_hangman) or die(mysql_error());

$word_amount[] = $amount;

$line = mysql_fetch_array($result, MYSQL_ASSOC);
array_push($word_amount, $line);
echo $line . "<br>";
$occ++;
}
echo '<pre>'.print_r($word_amount, true).'</pre>';
// ****************************************************************************************
// SHOW COLUMS WITH SCORE DETAILS *
// ****************************************************************************************
// Weergave van score
// ****************************************************************************************

$iSize = count($word_amount) >= count($categories) ? count($word_amount) : count($categories);

for ($i = 0; $i <= ($iSize/2); $i++)
{
echo
'<tr><td>'.(isset($categories[$i]) ? $categories[$i] : '&nbsp;').'</td>';
for($j=0; $j<=(count($categories)); $j++)
{
echo '<td>'.(isset($word_amount[$i][$j])? $word_amount[$i][$j]:'&nbsp;').'</td></tr>';
}
}
?>

Waarbij echo $line . "<br>"; nu een hele rij met de tekst 'Array' toont.

en echo '<pre>'.print_r($word_amount, true).'</pre>';
nu dit oplevert:

Array
(
[0] =>
[1] => Array
(
[0] => 876
)

[2] =>
[3] => Array
(
[1] => 57
)

[4] =>
[5] => Array
(
[2] => 122
)

[6] =>
[7] => Array
(
[3] => 104
)

[8] =>
[9] => Array
(
[4] => 172
)

[10] =>
[11] => Array
(
[5] => 71
)

[12] =>
[13] => Array
(
[6] => 189
)

[14] =>
[15] => Array
(
[7] => 113
)

[16] =>
[17] => Array
(
[8] => 71
)

[18] =>
[19] => Array
(
[9] => 107
)

[20] =>
[21] => Array
(
[10] => 165
)

[22] =>
[23] => Array
(
[11] => 68
)

[24] =>
[25] => Array
(
[12] => 9
)

[26] =>
[27] => Array
(
[13] => 171
)
)

De code ...
<?php
echo '<td>'.(isset($word_amount[$i][$j])? $word_amount[$i][$j]:'&nbsp;').'</td></tr>';
?>
... toont nu wel 1x de juiste score bij de categorie UIT DE TYCOON NEWSPAPER en alle andere scores ook, maar steeds een regel lager dan de bedoeling is. Hoe dat zit kun je hier zien:
http://www.wsnoi.com/index.php?page=oldhangman

en dan flink omlaag scrollen. Let even niet op de layout. Dat is voor mij van latere zorg.

Het lukt me maar niet om met de uiteindelijke echo van de scores alle getallen uit de array op de juiste plek naar de browser te krijgen. Maar we zijn op de goede weg.

Voor wat betreft die array $word_amount is dit misschien wat we voor elkaar moeten krijgen:

Array
(
[1] => 876
[2] => 57
[3] => 122
[4] => 104
[5] => 172
[6] => 71
[7] => 189
[8] => 113
[9] => 71
[10] => 107
[11] => 165
[12] => 68
[13] => 9
[14] => 171
)

Ook geprobeerd:

De forlus uitsterren zodat alle categorieën steeds 1x getoond worden. Want dat is de bedoeling.

<?php
// for($j=0; $j<=(count($categories)); $j++)
// {
echo '<td>'.(isset($word_amount[$i][$j])? $word_amount[$i][$j]:'&nbsp;').'</td></tr>';
// }
?>

... maar dan is [$j] natuurlijk niet gedefinieerd.

Ik ga eens kijken of ik die [$j] anders kan meegeven zodat die forlus niet nodig is.

Wordt vervolgd.

==================

EUREKA!

De laatste stap was gelukkig niet zo moeilijk.
De code hieronder is zelf verklarend. Maar hier even in het kort de laatste stapjes die ik heb gedaan om tot de oplossing te komen:
1. de binnenste forlus vervangen door een tellertje op $j buitenste forlus
2. $j daarna steeds ophogen met ++;
3. ($iSize/2); vervangen door ($iSize); Anders wordt de score maar half afgedrukt. Dit komt omdat de $word_amount multidimensionaal is opgebouwd. Daardoor moet je steeds 1 record overslaan om bij de volgende gevulde rij te komen.
4. Als gevolg van onder 3 genoemde aanpassing: in de forlus $i eerst declareren als 1 en daarna steeds met 2 ophogen.

<?php
$j = 0;
//for ($i = 1; $i <= ($iSize/2); $i++)
for ($i = 1; $i <= ($iSize); $i = $i + 2)
{
echo
'<tr><td>'.(isset($categories[$i]) ? $categories[$i] : '&nbsp;').'</td>';
//for($j=0; $j<=(count($categories)); $j++)
//{
echo '<td>'.(isset($word_amount[$i][$j])? $word_amount[$i][$j]:'&nbsp;').'</td></tr>';
//}
$j++;
}
?>

Het laatste puntje waar ik nog even aan moet werken is dat de categorieën nu maar tot de helft worden afgedrukt. Maar dat los ik buiten dit topic nog wel op.

Wil ik de uiteindelijke code zoals hier besproken nog toevoegen aan dit topic zodra ik dat laatste puntje ook heb opgelost?

Groeten en beide bedankt!

Gsorsnoi
De Oplossing!

<?php
// ****************************************************************************************
// GET SCORE PER CATEGORY FOR THIS CRIMINAL *
// ****************************************************************************************
// Per categorie de score ophalen van deze crimineel
// ****************************************************************************************
$occ = 0;
foreach ($score_tables as $table)
{
$sql_times_hangman = "SELECT COUNT( `best` ) AS `$occ` FROM `$table` WHERE `best` = '$criminal'";
$result = mysql_query($sql_times_hangman) or die(mysql_error());
if($localmode === true)
{
$adminqueries .=
"<br>SQL hoogste score van crimineel in categorie " . $table . ": " .
$sql_times_hangman . "<br>";
}

$word_amount[] = $amount;

$line = mysql_fetch_array($result, MYSQL_ASSOC);

array_push($word_amount, $line);
// echo $line . "<br>";
$occ++;
}
// echo '<pre>'.print_r($word_amount, true).'</pre>';
// ****************************************************************************************
// SHOW COLUMS WITH SCORE DETAILS *
// ****************************************************************************************
// Weergave van score
// ****************************************************************************************
$iSize = count($word_amount) >= count($categories) ? count($word_amount) : count($categories);

$j = 0;
$k = 1;
for ($i = 1; $i <= ($iSize); $i = $i + 2)
{
echo '<tr><td>'.(isset($categories[$k]) ? $categories[$k] : '&nbsp;').'</td>';
echo '<td>'.(isset($word_amount[$i][$j])? $word_amount[$i][$j]:'&nbsp;').'</td></tr>';

$j++;
$k++;
}
// ****************************************************************************************
?>

Alles werkt nu zoals het de bedoeling was. De categorieën worden nu ook goed afgedrukt.

In deze topic heb ik vooral geleerd om goed te beschouwen ...
1. met hoeveel arrays je te maken hebt.
2. in welke dimensies deze arrays voorkomen
3. hoe je d.m.v. variabelen in een query de array_push kan beïnvloeden.
4. en hoe deze uitgelezen moeten worden ...
5. ... al dan niet met ophogende tellertjes in of buiten lussen.
Wat ik mij nog steeds afvraag is waarom je steeds een array() in een array() zet en niet gewoon alleen het getal. Dan hou je namelijk een normaal array() over met al die getallen.
SanThe schreef op 18.11.2009 14:40
Wat ik mij nog steeds afvraag is waarom je steeds een array() in een array() zet en niet gewoon alleen het getal. Dan hou je namelijk een normaal array() over met al die getallen.


Wel SanThe, dat is eigenlijk wat ik juist wil, maar niet voor elkaar krijg.
PHP ligt me over het geheel genomen prima. Maar arrays heb ik altijd moeite mee gehad.
Kortom: hoe die array() in een array() terecht komt snap ik zelf ook niet.
Ik heb liever gewoon 1 array() met oplopend de scores. Zodat ik niet met al die tellertjes hoef te stoeien.
simpel,
je vult een array met de waardes, en dan gebruik je de arrays() eigen indexering als nr.
1 loopje...
een array bestaat uit zichzelf uit een lijst:
array[0] = eerste waarde
array[1] = 2de waarde,
enz...
Dat doe je hier.
array_push($word_amount, $line);
$line is namelijk een array().
koen schreef op 18.11.2009 14:55
simpel,
je vult een array met de waardes, en dan gebruik je de arrays() eigen indexering als nr.
1 loopje...
een array bestaat uit zichzelf uit een lijst:
array[0] = eerste waarde
array[1] = 2de waarde,
enz...


Maar bij het vullen van de array gaat het bij mij al fout.
Dan wordt op regel 23 $word_amount[] voor het eerst gevuld en ziet mijn array er als volgt uit:

Array
(
[0] =>
[1] => Array
(
[0] => 876
)

Maar ik wil dit:

Array
(
[0] => 876
)

Waarom snap ik niet. Waar in mijn code maak ik een extra niveau in mijn array?
SanThe schreef op 18.11.2009 15:01
Dat doe je hier.
array_push($word_amount, $line);
$line is namelijk een array().


Komt dat omdat ik dit heb gebruikt:

<?php
$line = mysql_fetch_array...
?>
???

Ik snap anders namelijk niet wanneer ik van $line een array maak. Daar is toch een statement voor nodig zoals deze:

<?php
$line[] = $iets;
?>

Of:

<?php
$line = array();
?>

Koen schreef op 18.11.2009 15:12

je maakt het een array door mysql_fetch_ARRAY
gebruikt dan assoc ofzo


Dat bevestigt mijn vraag. Die mysql_fetch_ARRAY zorgt dus voor de dubbele array in mijn code.

Gelieve Niet Bumpen:

Twee of meer keer achter elkaar in een topic posten heet bumpen. Bumpen is pas na 24 uur toegestaan en kan een reden zijn voor de admins en moderators om een topic te sluiten. Gebruik indien nodig de knop om je tekst aan te passen.

SanThe.
je maakt het een array door mysql_fetch_ARRAY
gebruikt dan assoc ofzo
Je moet dus $line['naam_van_het_veld'] gebruiken.

Reageren