foreach statement

Status
Niet open voor verdere reacties.

whitetigerck

Gebruiker
Lid geworden
8 aug 2008
Berichten
196
Hallo, ik heb weer is een vraagje:)

Ik ben niet zo goed bekend met het foreach statement en ik snap deze ook niet echt goed:confused:

Ik heb een database met gespeelde partijen per ronde.
Ik wil het foreach statement gebruiken ipv het for statement omdat mijn pagina nogal kreupel wordt als er 1 ronde mist en er komen er nog na. Bijv ronde 2 is leeg, maar ronde 1 en 3 en 4 hebben partijen. Dan geeft hij bij het for statement alleen ronde 1. Wie kan mij een opzetje geven?

Dit is wat ik nu heb met het for statement:

PHP:
setlocale (LC_ALL, 'nl_NL');
$query = "SELECT COUNT(DISTINCT ronde) as ronde FROM jeugdpartijen";
$results = mysql_query($query) or die ("Couldn't execute query 3.");
$result_array = mysql_fetch_row($results);
$nronden = $result_array[ 0 ];



for ( $i = 1 ; $i <= $nronden ; $i++ ) {

$query = "SELECT * FROM jeugdpartijen WHERE ronde = '$i'";
   		$results = mysql_query($query)
            or die ("couldn't execute query npartijen.");
			$rij = $row = mysql_fetch_array($results);
			$dateplay = strftime('%A %e %B %Y', strtotime($rij['datumgespeeld']));
echo "<br>Ronde $i, gespeeld op $dateplay. <br>"; 
echo "<table>";
$query = "SELECT * FROM jeugdpartijen WHERE ronde = '$i' ORDER BY `nummer` ASC";
   		$results = mysql_query($query)
            or die ("couldn't execute query 25npartijen.");
while ($row = mysql_fetch_array($results)){

echo "<tr><td>$row[nummer]</td><td>$row[wit]</td><td> - </td><td>$row[zwart]</td><td> $row[uitslag]</td></tr>";
}
echo "</table>";
}

alvast bedankt:thumb:
 
Deze reden dat het nu fout gaat is omdat je eerst het totaal aantal rondes opvraagt.

Stel dat dat 5 oplevert, maar dat is wel 1,2,5,7,8

De FOR-lus die je hebt gemaakt gaat van 1 tot en met 5 (in dit voorbeeld) dus 1,2,3,4,5
In je FOR-lus maak je een query aan de hand van het getal $i van de FOR-lus, daarom gaat hij dus de mist in.


Queries aan de hand van tekst bedenken is niet mijn sterkste punt.

Maar je doet het nu redelijk omslachtig.
Wat je kunt doen is eerst alle rondes ophalen
PHP:
$roundQuery = "SELECT DISTINCT ronde, datumgespeeld FROM jeugdpartijen";
$roundResult = mysql_query($roundQuery);
if(!$roundResult) {
  echo 'Er is een fout opgetreden! MySQL zegt: '. mysql_error();
} else {
  $roundsArray = array();
  while($roundRow = mysql_fetch_assoc($roundResult)) {
    $dateplay = strftime('%A %e %B %Y', strtotime($roundRow['datumgespeeld']));
    $roundArray[$roundRow['ronde']] = $dateplay;
  }
}
// Kijken wat er in de array zit
print_r($roundArray);
Hiermee worden (als het goed is) alle rondes in $roundArray gezet.

Ik ben er niet zeker van of die query doet wat ik denk dat ie moet doen, controleer even of hij ook daadwerkelijk de datum van die rond pakt.

Vervolgens gaat we die met een FOREACH doornemen
PHP:
foreach($roundArray as $round => $date) {
  $dataQuery = "SELECT nummer, wit, zwart, uitslag FROM jeugdpartijen WHERE ronde = '". $round ."' ORDER BY nummer";
  $dataResult = mysql_query($dataQuery);
  if(!$dataResult) {
    echo 'Er is een fout opgetreden! MySQL zegt: '. mysql_error();
  } else {
    echo 'Ronde '. $round .', gespeeld op '. $date .'<br />
    <table>';
    while($dataRow = mysql_fetch_assoc($dataResult)) {
      echo '<tr>
        <td>'. $dataRow['nummer'] .'</td>
        <td>'. $dataRow['wit'] .'</td>
        <td>-</td>
        <td>'. $dataRow['zwart'] .'</td>
        <td>'. $dataRow['uitslag'] .'</td>
      </tr>';
    }
    echo '</table>';
  }
}
Tis redelijk wat code dus ik garandeer niet dat het meteen goed gaat :D
Als je iets niet snapt horen we het :)
 
Laatst bewerkt:
Dankje, je code is helemaal perfect:thumb:

Alleen heb ik het niet zo graag dat ik een code heb die ik zelf niet helemaal snap, zo ben ik niet;)

De code is redelijk complex, volgens google doe je met distinct het aantal unieke ronden tellen, ik wist niet eens dat zoiets bestond:o

Alleen wat ik niet echt goed snap is toch die foreach:
PHP:
foreach($roundArray as $round => $date) {

Als ik het goed begrijpt pak je dan met elke waarde van $roundArray, de ronde en de datum appart.
Nu ik het zo doorlees begin ik langzaam het foreach te snappen, je split dus eigenlijk het nummer van de tekst hier.

Nu zit ik met een probleem van een pagina dat hij af en toe bepaalde records niet opslaat in mijn database en andere weer wel, meestal gaat dit goed maar als ik bijv meer dan 5 records tegelijk toevoeg slaat hij sommige gegevens over, je kan namenlijk zelf kiezen hoeveel records je wilt toevoegen. Het vreemde is dat dit meestal de eerste of de laatste zijn records zijn. De code waar ik het over heb is iets van 300 regels lang, en dat is een beetje teveel vind ik om jullie door te laten zoeken. Maar daar ga ik deze week mijn hersens over laten breken:D

Dit probleem is echter onafhankelijk van het probleem in dit topic, dit werkt geweldig;)
 
Kijken of ik de werking van een FOR en een FOREACH uit kan leggen met wat voorbeelden.

Stel je hebt deze array
PHP:
$array = array('aap', 'noot', 'mies');
Binnen de programmatuur is hij zo bekend:
PHP:
array(
 0 => 'aap',
 1 => 'noot',
 2 => 'mies'
)
Waarbij het linkerstuk voor de => de sleutel is (Die waarde is uniek in een array) en het rechterstuk de value dus de waarde achter de sleutel.

Als je die inhoud door wilt lopen met een FOR-lus dan moet je dus elk sleutel gaan vragen wat zijn inhoud is.

Aangezien je de sleutels automatisch laat genereren kun je dat met een FOR-lus doen.
PHP:
for($i = 0; $i < count($array); $i++) {
// We zetten $i op nul en laten de FOR-lus lopen zolang $i kleiner is dan het aantal elementen in $array
// Bij elke stap verhogen we $i met 1 ($i++)
  echo '$array['. $i .'] heeft de waarde .' $array[$i] .'<br />';
}

Gaan we de array met een FOREACH doorlopen wordt het
PHP:
foreach($array AS $key => $value) {
  // Noem van elk element in $array het linkerstuk $key en het rechterstuk $value
  echo '$array['. $key .'] heeft de waarde .' $value .'<br />';
}

Beide codes geven als het goed is hetzelfde resultaat.

Zelf gebruik ik altijd een FOR-lus wanneer ik de sleutels door PHP laat genereren.
Als ik ze zelf maak doe ik een FOREACH omdat ik dan niet met een getal de array door kan gaan.

In dit voorbeeld heb ik zelf de sleutels gedefineerd.
PHP:
$array = array(
  'een' => 'aap',
  'twee' => 'noot',
  'drie' => 'mies'
);
Voer je nu dezelfde acties uit zul je zien dat de FOR-lus met slechte resultaten komt.
PHP:
for($i = 0; $i < count($array); $i++) {
  echo '$array['. $i .'] heeft de waarde .' $array[$i] .'<br />';
}
echo '<hr />';
foreach($array AS $key => $value) {
  echo '$array['. $key .'] heeft de waarde .' $value .'<br />';
}

Wordt het zo duidelijker? :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan