php变量没有返回预期的内容

时间:2011-06-29 21:39:47

标签: php variables if-statement ternary-operator

我有一个从数据库生成的无序列表。根据返回字段之一的值,li标签的类应设置为不同的值。不幸的是,他们都回归“不活跃”。我知道这一定很简单,但我已经盯着它好几个小时了,我只是没有看到它。

以下是代码:

<ul class="tabs">
   <? foreach ($tracks AS $track) {
    $active = (strtolower($track->shortname === 'dpp')) ? ' class="active"' : 'class="inactive"';
    echo "<p>".strtolower($track->shortname). " is ".$active."</p>"; ?>
    <li <?= $active; ?>><a href="#<?= strtolower($track->shortname); ?>"><?= $track->name; ?></a></li>
   <? } ?>
</ul>

这是实际印刷的内容:

<ul class="tabs"> 
    <p>dpp is class="inactive"</p>  <li class="inactive"><a href="#dpp">Digital Path to Purchase</a></li> 
    <p>cre is class="inactive"</p>  <li class="inactive"><a href="#cre">Fueling Creativity</a></li> 
</ul> 

很明显,第一个是返回dpp的$ track-shortname,那么为什么$ active变量没有设置为“class = active”?

3 个答案:

答案 0 :(得分:2)

您在检查短名称的表达式中输入了错误:

$active = (strtolower($track->shortname === 'dpp')) ? ' class="active"' : 'class="inactive"';
                     ^                           ^

你当然只想把它放在$track->shortname

$active = (strtolower($track->shortname) === 'dpp') ? ' class="active"' : 'class="inactive"';
                     ^                 ^

否则你试图小写一个布尔值,该值为true或false,但在你的情况下,它看起来总是为false,因此是非活动的CSS类。

顺便说一句,你可以省去另外一对:

$active = strtolower($track->shortname) === 'dpp' ? ' class="active"' : 'class="inactive"';
         ^                                       ^

答案 1 :(得分:1)

代码(strtolower($track->shortname === 'dpp'))看起来不对。您将strtolower放在比较周围,您可能只想在$track->shortname附近。

答案 2 :(得分:1)

你的一个近括号是在错误的地方。

变化:

$active = (strtolower($track->shortname === 'dpp')) ? ' class="active"' : 'class="inactive"';

要:

$active = (strtolower($track->shortname) === 'dpp') ? ' class="active"' : 'class="inactive"';

如果括号位于错误的位置,则会在任何小写转换之前将$track->shortnamedpp进行比较。然后将该比较的结果(布尔值)传递给strtolower。这导致strtolower只返回一个字符串表示形式,导致三元比较评估为false。