根据星期几显示PHP对象

So I have the hours of a business set up in 7 different objects each for a day of the week. I wanted to be able to display in the header the hours of this business for the day that it currently is. Set it up like this but it won't spit anything out

<?php
    $d=date("D");
    if ($d=="Mon")
    echo <?php echo of_get_option('monday', 'no entry'); ?>;
    elseif ($d=="Tue")
    echo <?php echo of_get_option('tuesday', 'no entry'); ?>;
    elseif ($d=="Wed")
    echo <?php echo of_get_option('wednesday', 'no entry'); ?>;
    elseif ($d=="Thu")
    echo <?php echo of_get_option('thursday', 'no entry'); ?>;
    elseif ($d=="Fri")
    echo <?php echo of_get_option('friday', 'no entry'); ?>;
    elseif ($d=="Sat")
    echo <?php echo of_get_option('saturday', 'no entry'); ?>;
    elseif ($d=="Sun")
    echo <?php echo of_get_option('sunday', 'no entry'); ?>;
    else
    echo "Have a nice day!";
?>

I am assuming you don't have problems with the nested php tags, would be too obvious.

Since the conditions are correct, you should check the function of_get_option(). How does it work, does it return anything? Check with var_dump().

Furthermore it would be way cleaner to use

date("N")

so you get numbers from 1 to 7 for the weekdays.

edit: Ok, in reply to your comment, I think you copypasted these php-tag-parts from somewhere. So please try:

<?php
    $d=date("D");
    if ($d=="Mon")
      echo of_get_option('monday', 'no entry');
    elseif ($d=="Tue")
      echo of_get_option('tuesday', 'no entry');
    elseif ($d=="Wed")
      echo of_get_option('wednesday', 'no entry');
    elseif ($d=="Thu")
      echo of_get_option('thursday', 'no entry');
    elseif ($d=="Fri")
      echo of_get_option('friday', 'no entry');
    elseif ($d=="Sat")
      echo of_get_option('saturday', 'no entry');
    elseif ($d=="Sun")
      echo of_get_option('sunday', 'no entry');
    else
      echo "Have a nice day!";
?>

Try using switch and remove extra tags from code, for example

$d=date("D");
switch ($d) {
case "Mon":
echo of_get_option('monday', 'no entry');
break;
case "Tue":
echo of_get_option('tuesday', 'no entry');
break;
default:
echo "Have a nice day!";
}

You certainly don't need to open other PHP tags if one is already open.


It's nice that a solution has been found, but let me post a version that is a bit more readable and there is no unnecessary repetition. It uses an array for mapping purposes.

<?php
    $d=date("D");
    $mapping=array(
        "Mon" => "monday",
        "Tue" => "tuesday",
        "Wed" => "wednesday",
        ...
    );

    if (array_key_exists($d, $mapping)) {
        echo of_get_option($mapping[$d], 'no entry');
    }
    else {
        echo "Have a nice day!";
    }
?>

In your if/else you dont need the else at all. Have a look at the manual for date. The only way date will return false is when you pass in a non-numeric timestamp for the second argument. You are not doing that, so date will return one of the days anyways.

But, instead of using if/else or switch/case (which would be the same), why dont you just use

echo of_get_option(strtolower(date('l')), 'no entry');

Calling date with l will give you the name of the day. strtolower will make it all lowercase. That mapping you are doing there is superfluous. The single line above is equivalent to the entire snippet you show in your question.

On a sidenote, what kind of function name is of_get_option? What is of? Does it stand for office? And if it does, why is that a function rather than a method on an Office object? After all, you said you are using objects. And why does it say get_option when its supposed to display office hours? Shouldn't the name rather be getOfficeHoursOnDay($day) or even better, displayOfficeHoursOnDay($listRenderer, $day). Try to make your code more expressive and readable and try to move responsibilites where they belong.

I would suggest getting away from using strings at all. Date returns localized strings depensing upon locale settings. So you wind up with a magic string that isn't so magic.

Instead, use the numeric day of week:

 of_get_option(date('w'));

You will of course need to change the function to accept it. But its easier to understand, more portable, and IMHO cleaner...