ben bezig met een functie voor openingstijden te tonen op mijn site.

Ik werk met switch en voor elke dag een case.
De output wil ik mooi onder elkaar zoals:

Maandag     10:00 - 18:00
Dinsdag     10:00 - 18:00
Woensdag    10:00 - 18:00
donderdag   10:00 - 18:00
vrijdag     10:00 - 18:00
zaterdag    10:00 - 18:00
zondag      10:00 - 18:00



en niet

Maandag 10:00 - 18:00
Dinsdag 10:00 - 18:00
Woensdag 10:00 - 18:00
donderdag 10:00 - 18:00
vrijdag 10:00 - 18:00
zaterdag 10:00 - 18:00
zondag 10:00 - 18:00

Natuurlijk kan ik een tabel element in de variable zetten, maar ik hoor hier en daar dat de style niet door php moet worden gedaan maar door de browser.
Welke manier kan ik het beste toepassen hiervoor?
maar ik hoor hier en daar dat de style niet door php moet worden gedaan maar door de browser.

Eh? Het enige waar je PHP voor nodig hebt is voor het invullen van de variabele delen zodat je e.e.a. dynamisch kunt opbouwen.

Deze informatie wordt vervolgens in een of andere opmaak gegoten, bijvoorbeeld een tabel. Maar dit "statische" en dynamische deel zijn onlosmakelijk met elkaar verbonden.

Het is echter niet nodig om alle statische lappen HTML te echo'en omdat daar dus niets dynamisch aan is. Gelukkig kun je te allen tijde een PHP-blok beëindigen en weer starten zodat dit onderscheid statisch <--> dynamisch ook op die manier duidelijk(er) gemaakt kan worden.

En hoe je dat vervolgens implementeert, dat kan op een heleboel manieren waarbij je de PHP en de HTML uit elkaar trekt (bijvoorbeeld via een template of wat dan ook) maar uiteindelijk worden deze twee toch (weer) bij elkaar gebracht, onafhankelijk van het aantal abstractielagen die je tussen het begin (PHP) en het eind (de HTML output) introduceert. Dus waarom zou je het jezelf onnodig moeilijk maken?
Hoe genereer je nu de data?

<?php
function time_schedule(){

	date_default_timezone_set('Europe/Amsterdam');
	$weekdag = (int) date('w');

		switch ($weekdag) {
		
			case 0:  // zondag
			$today = "<tr><td>Vandaag gesloten</td></tr>";
			$time_table = "
			<tr><td>Maandag</td><td>:</td><td>Gesloten</td></tr>
			<tr><td>Dinsdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			<tr><td>Woensdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			<tr><td>Donderdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			<tr><td>Vrijdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			<tr><td>Zaterdag</td><td>:</td><td>10:00 - 16:00</td></tr>
			";
			break;
	
			case 1:  // maandag
			$today = "<tr><td>Vandaag gesloten</td></tr>";
			$time_table = "
			<tr><td>Dinsdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			<tr><td>Woensdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			<tr><td>Donderdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			<tr><td>Vrijdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			<tr><td>Zaterdag</td><td>:</td><td>10:00 - 16:00</td></tr>
			<tr><td>Zondag</td><td>:</td><td>Gesloten</td></tr>
			";
			break;	
	
			case 2:  // dinsdag	
			$today = "<tr><td>Vandaag open tot 18:00</td></tr>";
			$time_table = "
			<tr><td>Woensdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			<tr><td>Donderdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			<tr><td>Vrijdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			<tr><td>Zaterdag</td><td>:</td><td>10:00 - 16:00</td></tr>
			<tr><td>Zondag</td><td>:</td><td>Gesloten</td></tr>
			<tr><td>Maandag</td><td>:</td><td>Gesloten</td></tr>
			";
			break;	
	
			case 3:  // woensdag	
			$today = "<tr><td>Vandaag open tot 18:00</td></tr>";
			$time_table = "
			<tr><td>Donderdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			<tr><td>Vrijdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			<tr><td>Zaterdag</td><td>:</td><td>10:00 - 16:00</td></tr>
			<tr><td>Zondag</td><td>:</td><td>Gesloten</td></tr>
			<tr><td>Maandag</td><td>:</td><td>Gesloten</td></tr>
			<tr><td>Dinsdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			";
			break;	
	
			case 4:  // donderdag	
			$today = "<tr><td>Vandaag open tot 18:00</td></tr>";
			$time_table = "
			<tr><td>Vrijdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			<tr><td>Zaterdag</td><td>:</td><td>10:00 - 16:00</td></tr>
			<tr><td>Zondag</td><td>:</td><td>Gesloten</td></tr>
			<tr><td>Maandag</td><td>:</td><td>Gesloten</td></tr>
			<tr><td>Dinsdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			<tr><td>Woensdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			";
			break;	
	
			case 5:  // vrijdag	
			$today = "<tr><td>Vandaag open tot 18:00</td></tr>";
			$time_table = "
			<tr><td>Zaterdag</td><td>:</td><td>10:00 - 16:00</td></tr>
			<tr><td>Zondag</td><td>:</td><td>Gesloten</td></tr>
			<tr><td>Maandag</td><td>:</td><td>Gesloten</td></tr>
			<tr><td>Dinsdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			<tr><td>Woensdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			<tr><td>Donderdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			";
			break;	
	
			case 6:  // zaterdag	
			$today = "<tr><td>Vandaag open tot 16:00</td></tr>";
			$time_table = "
			<tr><td>Zondag</td><td>:</td><td>Gesloten</td></tr>
			<tr><td>Maandag</td><td>:</td><td>Gesloten</td></tr>
			<tr><td>Dinsdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			<tr><td>Woensdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			<tr><td>Donderdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			<tr><td>Vrijdag</td><td>:</td><td>10:00 - 18:00</td></tr>
			";
			break;
	}

return array('today' => $today, 'time_table' => $time_table);
}
?>


Nu heb ik dus wat Thomas zegt, veel html erin.
Waarom ik deze vraag stel is omdat ik met een database wil werken waarin de dagen met tijden staan.
deze wil ik natuurlijk netjes presenteren
Een array met de dagen en tijden zou simpeler zijn. Ook indien het in de database staat.

Dan hoef je geen code te herhalen, en houd je HTML en PHP meer gescheiden.

Enige buiten je functie is een foreach() { ..} op je pagina om de array mee uit te lezen. En daarin verwerk je jouw tabel.
Mja als je wat meer structuur in de dynamische delen aanbrengt kan bovenstaande code een stuk korter.

Wat in ieder geval nogal onhandig is aan het bovenstaande is dat de data geen betekenis heeft (platte tekst) en meerdere keren wordt herhaald, wat het nogal foutgevoelig maakt, vooral als er bijvoorbeeld een openings- of sluitingstijd wijzigt.

Zorg op zijn minst dat je één bron hebt voor een specifiek stuk informatie.
Je idee is leuk, maar dit is totaal niet onderhoudsvriendelijk.
Het voordeel van dynamisch is dat je je inhoud maar op 1 plek hoeft aan te passen, maar wel op meerdere plekken en op verschillende manieren kan weergeven.
Ik heb een klein voorbeeldje gemaakt, maar het kan vast nog wel eenvoudiger.
Voorbeeld

<?php
function time_schedule(){

$time_table = array(
array('Zondag', array('Gesloten')),
array('Maandag', array('Gesloten')),
array('Dinsdag', array('10:00','18:00')),
array('Woensdag', array('10:00','18:00')),
array('Donderdag', array('10:00','18:00')),
array('Vrijdag', array('10:00','18:00')),
array('Zaterdag', array('10:00','16:00')),
);

date_default_timezone_set('Europe/Amsterdam');
$weekdag = (int) date('w');

$table = '<table>';
for($i=$weekdag;$i<7;$i++) {
if($i == $weekdag) {
$table .= '<tr><td colspan="2">Vandaag ' . (isset($time_table[$i][1][1]) ? 'open tot ' . $time_table[$i][1][1] : 'zijn we gesloten') . '</td></tr>';
} else {
$table .= '<tr><td>' . $time_table[$i][0] . '</td><td>' . $time_table[$i][1][0] . (isset($time_table[$i][1][1]) ? ' - ' . $time_table[$i][1][1] : '') . '</td></tr>';
}
}
for($i = 0; $i < $weekdag; $i++) {
$table .= '<tr><td>' . $time_table[$i][0] . '</td><td>' . $time_table[$i][1][0] . (isset($time_table[$i][1][1]) ? ' - ' . $time_table[$i][1][1] : '') . '</td></tr>';
}
$table .= '</table>';
return $table;
}
echo time_schedule();
?>
Je mist een controle op lijn 20 of er Gesloten in de array staat. Anders krijg je een offset-notice, als de winkel op een bewuste dag gesloten is.
- Ariën - op 24/10/2018 20:45:27

Je mist een controle op lijn 20 of er Gesloten in de array staat. Anders krijg je een offset-notice, als de winkel op een bewuste dag gesloten is.


Scherp! Aangepast.
<?php
// https://www.phphulp.nl/php/forum/topic/php-output-in-mooie-opmaak/102495
function openingstijden() {
    // the data
    $data = array(
        array('closed' => true,  'opening' => '-', 'closing' => '-'),           // zon
        array('closed' => true,  'opening' => '-', 'closing' => '-'),           // maa
        array('closed' => false, 'opening' => '10:00', 'closing' => '18:00'),   // din
        array('closed' => false, 'opening' => '10:00', 'closing' => '18:00'),   // woe
        array('closed' => false, 'opening' => '10:00', 'closing' => '18:00'),   // don
        array('closed' => false, 'opening' => '10:00', 'closing' => '18:00'),   // vry
        array('closed' => false, 'opening' => '10:00', 'closing' => '16:00'),   // zat
    );
    $days = array('zondag','maandag','dinsdag','woensdag','donderdag','vrijdag','zaterdag'); // 0 = zondag, 6 = zaterdag
    $currentDay = date('w');

    // the table
    ob_start();
        // don't forget colspan = 2 ...
        ?><table border="1">
        <tr>
            <td colspan="2"><?php
            if ($data[$currentDay]['closed']) {
                ?>Vandaag gesloten<?php
            } else {
                ?>Vandaag open tot <?php
                echo $data[$currentDay]['closing'];
            }
            ?></td>
        </tr><?php
        for ($i=1; $i < 7; $i++) { // we start at one, we skip current day
            $dayOfWeek = ($currentDay + $i) % 7;
            ?><tr>
                <td><?php echo ucfirst($days[$dayOfWeek]); ?>:</td>
                <td><?php
                if ($data[$dayOfWeek]['closed']) {
                    ?>gesloten<?php
                } else {
                    echo $data[$dayOfWeek]['opening'].' - '.$data[$dayOfWeek]['closing'];
                }
                ?></td>
            </tr><?php
        }
        ?></table><?php
    return ob_get_clean();
}
echo openingstijden();
?>

Handiger om de hele table in de function op te bouwen in plaats van individuele delen te retourneren, tenzij je die ergens anders nodig hebt? Extra "closed" attribuut om e.a.a. beter te scheiden en de HTML leesbaar te houden. Resultaat geretourneerd als string zodat je zelf nog kunt bepalen waar je de tabel weergeeft als je die op een andere plek al op moet halen en aan een template moet doorgeven ofzo.
Extra "closed" attribuut om e.a.a. beter te scheiden en de HTML leesbaar te houden.

Dat is een manier. Ik vind het ontzettend lelijk en onzin om steeds af te sluiten en weer te openen. Ik vind het er absoluut niet leesbaarder van worden. Gelukkig mag ieder voor zijn eigen bepalen hoe die het doet ;-).

Reageren