PHP 代码不是 运行 循环之前

PHP code is not running before loop

<?php
$date = '2017-08-22';
$year = substr($date, 0, 4);
$month = substr($date, 5, 2);
$day = substr($date, 8, 2);
?>

<select>
<?php
for ($i=1; $i < 30; $i++) { ?>
<option value="<?php echo $i; ?>" <?php if($day === $i){ echo "selected"; }; ?>><?php echo $i; ?></option>
<?php } ?>

</select>

代码未执行,因为 substr 不是 for 循环之前的 运行。 select 应该在第 22 天 selected 但它没有 selecting 任何东西。如果我更改 $day = 22;,它会起作用。我怎样才能用子字符串解决这个问题?

你正在做 === 这是一个严格的匹配,因为你的 year/month/day 都是字符串,你的一天永远不会成功。你需要使用 ==

'22' === 22; // false
'22' == 22; // true

尝试在 substr 之后 var_dump$ 天看看会发生什么。也就是说,您正在使用 === 三重等于比较,它也将检查类型。 substr returns 一个字符串,而您正在将它与一个整数进行比较,因此条件永远不会为真。

是的,我评论了一些问题,您可以使用下面的代码来修复

<?php
    $date = '2017-08-22';
    $dateSec = strtotime($date);
    $year = date("Y",$dateSec);
    $month = date("m",$dateSec);
    $day = date("d",$dateSec);
    $day_in_month = date("t",$dateSec);
    echo "<select>";
    for ($i=1; $i <= $day_in_month; $i++) {
            $selected = ($day==$i) ? ' selected ':'';
            echo "<option $selected value='$i'>$i</option>";
    }
    echo "</select>";
?>

当您通过 === 比较值时会出现问题,因为您正在比较的值不包含相同的数据类型。 $day 包含“string”数据类型,'$i' 包含“int”数据类型。

所以,为了解决这个问题,有以下两种可能的解决方案,请尝试其中一种:

要么你用==代替===,就像这样:

if($day == $i)

$day, $month & $year变量赋值时使用(int)数据类型,就像这样:

$day = (int)substr($date, 8, 2);

希望这对您有所帮助。

试试这个

你只需更改 <option> 标签中的下面一行。

if($day === $i)

if($day == $i)