【问题标题】:Conditional if inside variable有条件的 if 内部变量
【发布时间】:2014-12-06 03:40:43
【问题描述】:

我有nav.php,里面有 2 个变量。我想通过回显变量将nav.php 包含在index.php 中。 nav.php代码如下:

<?php 
$TopLeftNav = '<li if ($_SERVER['PHP_SELF'] == "/dashboard.php") echo "class = 'active'" ><a href="dashboard.php">Dashboard</a></li>
<li if ($_SERVER['PHP_SELF'] == "/website.php") echo "class = 'active'" ><a href="website.php">Add Website</a></li>
<li php if ($_SERVER['PHP_SELF'] == "/report.php") echo "class = 'active'" ><a href="report.php">Reports</a></li>';

$TopRightNav = '<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </a>';
?>

如您所见,变量$TopLeftNav 不起作用,因为其中的if 条件。条件是突出显示当前活动页面。

我知道我可以通过创建单独的文件(例如 nav1.phpnav2.php)和分离导航 html 来使它们工作,但出于学习目的,我该如何解决这个问题?提前致谢。

【问题讨论】:

  • 当你从字符串文字切换到 PHP 代码时,代码应该只是猜测?为什么会有这样的工作?
  • 我的朋友正在疯狂编码!就这样!!

标签: php string variables if-statement include


【解决方案1】:

你可以这样做:

<?php 
// set the variables we will use to an empty string
$web_class = '';
$dash_class = '';
$report_class = '';

// check the PHP_SELF and set a variable
if ($_SERVER['PHP_SELF'] == "/website.php") {
    $web_class  = 'active';
} elseif ($_SERVER['PHP_SELF'] == "/dashboard.php") {
    $dash_class  = 'active';
} elseif ($_SERVER['PHP_SELF'] == "/report.php") {
    $report_class  = 'active';
}

// generate the output
$TopLeftNav = '<li class="'.$dash_class.'"><a href="dashboard.php">Dashboard</a></li>';
$TopLeftNav .= '<li class="'.$web_class.'"><a href="website.php">Add Website</a></li>';
$TopLeftNav .= '<li class="'.$report_class.'"><a href="report.php">Reports</a></li>';

$TopRightNav = '<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </a>';
?>

虽然我更倾向于做这样的事情:(一个 switch 语句)http://php.net/manual/en/control-structures.switch.php

<?php

// set the variables we will use to an empty string
$web_class = '';
$dash_class = '';
$report_class = '';


switch through the PHP_SELF and set the variables accordingly
switch ($_SERVER['PHP_SELF']){
    case '/dashboard.php':
        $dash_class  = 'active';
        break;
    case '/report.php':
        $report_class  = 'active';
        break;
    case '/website.php':
        $web_class  = 'active';
        break;
}

// generate the output
$TopLeftNav = '<li class="'.$dash_class.'"><a href="dashboard.php">Dashboard</a></li>';
$TopLeftNav .= '<li class="'.$web_class.'"><a href="website.php">Add Website</a></li>';
$TopLeftNav .= '<li class="'.$report_class.'"><a href="report.php">Reports</a></li>';

$TopRightNav = '<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </a>';
?>

switch 语句非常适合这种事情,因为当您在几年后再次使用它时,生成的代码更具可读性。

【讨论】:

  • 感谢您的帮助。是的,switch case 更容易理解。
  • 喜欢这个答案如何突然“改变”为与以前完全不同的东西,现在看起来真的像我用 switch 语句的答案......哦,是的,“改变”发生在我回答后 10-15 分钟......让你想知道。
  • 改变了吗?这不是这个网站的重点吗?你不能编辑你自己的问题吗?
  • @Jonathan 是的,但不要“借用”其他答案。
【解决方案2】:

这应该适合你:

这里我使用这样的三元运算符:

(conditional expression) ? (ouput if true) : (output if false);

<?php 
    $TopLeftNav = '<li  ' . ($_SERVER['PHP_SELF'] == "/dashboard.php" ? ' class = \'active\' ' : '') . ' ><a href="dashboard.php">Dashboard</a></li>
    <li  ' . ($_SERVER['PHP_SELF'] == "/website.php" ? ' class = \'active\' ' : '') . ' " ><a href="website.php">Add Website</a></li>
    <li ' . ($_SERVER['PHP_SELF'] == "/report.php" ? ' class = \'active\' ' : '') . ' " ><a href="report.php">Reports</a></li>';

    $TopRightNav = '<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </a>';
?>

【讨论】:

  • 也修复其他行,也许解释一下你做了什么。如果您想将其提升到另一个层次,请使用变量来避免一直比较 PHP_SELF... 有足够的空间来优化此代码并向初学者展示它是如何完成的。
  • 与其只给他答案,不如解释一下你在做什么。任何在原始问题中编写代码的人都不会理解三元运算符。编辑:被 Shomz 打败!
【解决方案3】:

好的,因为其他答案看起来更像是黑客而不是有用的东西,请考虑这种方法:

<?php 
// three classes for each for easier adding them to the HTML strings
// each of them will be assigned a value of "class = 'active'" in case of matching urls
// or just an empty string otherwise
$dashboardClass = $_SERVER['PHP_SELF'] == "/dashboard.php" ? "class = 'active'" : "";
$reportClass = $_SERVER['PHP_SELF'] == "/report.php" ? "class = 'active'" : "";
$websiteClass = $_SERVER['PHP_SELF'] == "/website.php" ? "class = 'active'" : "";

$TopLeftNav = "
<li $dashboardClass><a href='dashboard.php'>Dashboard</a></li>
<li $websiteClass><a href='website.php'>Add Website</a></li>
<li $reportClass><a href='report.php'>Reports</a></li>";

$TopRightNav = '<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </a>';
?>

因此,我们的想法是为三个类中的每一个存储要回显的值(因此我们有三个新变量)。我还从单引号切换到双引号,以便直接插入 PHP 字符串,而无需连接任何内容,例如,如果 PHP_SELF 与 dashboard.php 匹配,&lt;li $dashboardClass&gt; 将变为 &lt;li class='active'&gt;,或者只是 &lt;li&gt;否则。

三元运算符:

这个:$dashboardClass = $_SERVER['PHP_SELF'] == "/dashboard.php" ? "class = 'active'" : ""; 和这个一样:

if ($_SERVER['PHP_SELF'] == "/dashboard.php") {
    $dashboardClass = "class = 'active'";
}
else {
    $dashboardClass = '';
}

【讨论】:

  • 我不明白为什么。这是(ish)我会怎么做(虽然实际上,当然,模板!)
  • @LightnessRacesinOrbit 是的,这是我在不混淆 OP 的情况下尽可能接近模板。 :)
  • 感谢您的帮助和三元解释:)
  • 这不是愚蠢,每个人都在某个时候学习过。 :) 双点(或冒号)表示分隔符,在它之前是“if”情况,之后是“else”情况。像这样:condition ? true_case_here : false_case_here; 现在有意义吗?
  • 所以我的整行代码是这样的:$variable = (condition ? value_if_condition_true : value_if_condition_false); 并且变量会根据条件获得第一个 ("class='active'") 或第二个 ("") 值。跨度>
猜你喜欢
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
  • 2012-02-26
  • 2020-11-02
  • 1970-01-01
相关资源
最近更新 更多