Hello,

Ergens waar ik niet helemaal uitkom is het volgende.

Ik heb een lijst in de database als volgt

id - name - datetime

Nu wil ik vervolgens deze items allemaal selecteren en laten zien als volgt

Ik heb een tabel in mijn pagina met datum in het linker kolom en vervolgens tijden

| datum | 9 tot 10 | 10 tot 11 | etc etc..

Vervolgens wil ik de namen die ik uit de database wil halen sorteren en goed zetten aan de hand van datum/tijd.. maar hoe doe ik dit handig? ik kom er even zelf niet meer uit dus als iemand even mee kan/wil denken :)
Je bedoelt gewoon je resultaten sorteren op datum/tijd ?
in je SQL query ORDER BY datetime DESC

als je de nieuwste als eerste wilt gebruiken we DESC, en als je de oudste wilt, ASC
vul je voorbeeldje eens verder aan? je laat nu alleen de headers zien maar laat eens een voorbeeld-rij zien?
@Dennis nee in vakjargon heet dit pivot table

@Frank


DATE       | 9 to 10  | 10 to 11   | 11 to 12

11-10-2013 | John     | Chris      | Barbara



Maar mochten er dus meerdere namen op dezelfde tijdstip komen te vallen bijvoorbeeld tussen 9 en 10 dan krijg je dus John en eronder weer de volgende naam. maar ik ben al blij als hij het zoals in het voorbeeldje al doet :)
Volgens mij moet je twee dingen splitsen. Ten eerste heb je het ophalen van je data uit de database, ten tweede heb je de presentatie op het scherm. In menig applicatie zijn die lagen al gescheiden en in dit geval zou ik er zeker voor kiezen om dat te doen. Het ophalen van de data wordt dan vrij eenvoudig

SELECT id, naam, DATE(datetime) AS datum, TIME(datetime) AS tijd
FROM tabel
WHERE....

En in php kan je de presentatie verzorgen. Ik zou er dan gewoon een matrix van maken. Dus door al je opgehaalde records lopen en in feite alleen dit doen:
<?php
$matrix = array();
while( $row = etc ){
$matrix[$row['datum']][$row['tijd'][] = $row['naam'];
}
?>
Vervolgens kan je die matrix omzetten naar een mooie tabel.
Je kan de hele matrix vast ook wel in SQL bouwen, maar persoonlijk zie ik daar het nut niet van in, helemaal niet als je data en presentatie toch al gescheiden hebt, dan wil je helemaal niet dat je datalaag bepaalt hoe de data vorm gegeven wordt.
Natuurlijk kan je zo'n matrix ook in SQL bouwen, en ik zie ook het nut daar niet van in. Databases zijn 2 dimensionaal, alleen ik begrijp jou argumentatie niet helemaal.
Imo heeft een array opbouwen niets met presentatie te maken maar met data, in een MVC zou ik dat in het model doen.

En als ik een beetje ga muggenziften ben je ook niet helemaal consequent, DATE(datetime) en TIME(datetime) is dan ook presentatie.
Als je ziet hoe ik die matrix bouw dan zie je dat dat in feite die matrix al in het model gebouwd wordt. Maar op zich is dat een keuze. Het is een tussenstap tussen de rauwe data die je uit een database haalt en de vorm waarin je het in de view nodig hebt. Of je die tussenstap dus uitvoert in het model, of in de view (in MVC termen) is volgens mij gewoon een persoonlijke keuze.

Het DATE en TIME is inderdaad al inconsequent, op zich niet nodig.
Erwin ik heb een beetje moeite om de array nu netjes in mijn tabel te krijgen Ik heb het volgende tot nu toe. ( de data komen nu goed ) maar ik krijg de namen niet in de juiste vakjes bij de juiste tijd..



En de code als volgt.

<?php

$res = $mysqli->query(
"SELECT name, date(datum) as datum, hour(datum) as tijd
FROM Lijst
ORDER BY datum
");
if(!$res) {
echo "Failed to run query: (" . $mysqli->errno . ") " . $mysqli->error;
}
else {

$matrix = array();
while ($row = $res->fetch_assoc()) {

$matrix[$row['datum']]['tijd'][] = $row['name'];

$var = '<table class="striped">';
$var .= '<tr class="header" id="ax">';
$var .= '<td id="a_datum">Datum</td>';

for($i=9; $i<24; $i++) {

$var .= '<td>' . $i . ':00</td>';
}

$var .= '</tr>';

foreach ($matrix as $key => $value) {
# code...
$var .= '<tr>';
$var .= '<td>';
$var .= $key;
$var .= '</td>';

$var .= '</tr>';

}


$var .= '</table>';



}

echo $var;

}

?>

ps. de bovenste row maak ik gewoon zelf met die for loop dat zijn niet de tijden uit de DB
Je moet eerst de matrix opbouwen in de while lus en die dan daarna uitlezen:
<?php
// eerst een array voor de tijden zodat elke datum alle tijden krijgt
$times = array();
for ($i=9; $i<24; $i++) {
	$times[$i] = array();
}
$res = $mysqli->query(
    "SELECT name, date(datum) as datum, hour(datum) as tijd
    FROM Lijst
    ORDER BY datum, tijd
    ");
$date = '';
if(!$res) {
    echo "Failed to run query: (" . $mysqli->errno . ") " . $mysqli->error;
} 
else {
	$matrix = array();
	// matrix vullen
	while ($row = $res->fetch_assoc()) {
		if ($row['datum'] != $date) {
			$date = $row['datum'];
			$matrix[$date] = $times;
		}
		$matrix[$date][$row['tijd']][] = $row['name'];
	}
	// de tabel beginnen
	$var = '<table class="striped">';
    $var .= '<tr class="header" id="ax">';
	$var .= '<td id="a_datum">Datum</td>';
            
	for($i=9; $i<24; $i++) {

		$var .= '<td>' . $i . ':00</td>';                        
	}
            
	$var .= '</tr>';
	// de matrix uitlezen
	foreach ($matrix as $datekey => $timearray) {
		$var .= '<tr><td>' . $datekey . '</td>';
		foreach ($timearray as $names) {
			$var .= '<td>';
			if (count($names) > 0) {
				$var .= implode('<br>', $names);
			}
			else {
				$var .= '&nbsp;';
			}
			$var .= '</td>';
		}
		$var .= '</tr>' . PHP_EOL;
	}
	$var .= '</table>';
	echo $var;
}
?>
@Ger

Precies als ik nodig had!

thanks :)

Toevoeging op 13/10/2013 11:23:35:

[edit]

Ik heb nu een tweede tijd toegevoegd zodat ik kan aangeven uur VAN en uur TOT dit lukt al. alleen hoe krijg ik nu alle uren daartussen ook gevuld?
In plaats van op regel 24 één tijd in te vullen met een for lus:
<?php
for ($h = (int)$row['van']; $h < (int)$row['tot']; $h++) {
	$matrix[$date][$row[$h]][] = $row['name'];
}
?>

Of bedoel je dit niet?

Reageren