【问题标题】:Get list of cases in switch statement获取switch语句中的case列表
【发布时间】:2011-07-30 16:47:12
【问题描述】:

我使用 PHP Switch 语句来确定我网站的页面。所以这里是一个例子:

switch($page) {
    case "about":
        $title_name = "About Us";
        $page_content = "includes/about-us.php";
        include("inner.php");
    break;
    case "services":
        $title_name = "Services";
        $page_content = "includes/services.php";
        include("inner.php");
    break;
}

我的文件结构是 index.php?page=about ,它使用 htaccess 转换为 /about/

我想要做的是在那个 switch 语句中获取我的所有页面,并自动抓取它并将其放入一个列表中,这样我就可以自动让它写入我的页脚页面,在那里我将拥有所有链接。

所以不要手动输入页脚中的所有链接,例如:主页 |关于我们 |服务 | FAQ ,它会根据我在 Switch 语句中提供的页面自动拉取。

有没有办法做到这一点?自动添加新页面也很好,它会为新页面添加一个新案例,并在包含文件夹中自动创建页面。

如果有人能指出我正确的方向,我将不胜感激。根据我的理解,我不相信你可以用 switch 语句来做到这一点,我必须重新设计我调用页面的方式,对吧?

【问题讨论】:

  • +1 表示有趣的问题,尽管我怀疑这是否可能。我也想看看你的问题的答案。
  • 如果你想阅读报表 - 这是不可能的。嗯,这是可能的,但以非常丑陋和不稳定的方式。
  • @OZ_:你是说分词器?我也不推荐它,除非一个真的想要分析源(例如 api 生成或类似的东西)。
  • @KingCrunch 我的意思是解析源代码 :) 这是个非常糟糕的主意。我建议编写普通的路由算法。对于 OP 的需要,它可以在 .xml 配置中进行配置。

标签: php dynamic switch-statement


【解决方案1】:
$pages = array('about'=> 'About Us', 'services' => 'Services');

if (array_key_exists($page, $pages)) {
   $title_name = $pages[$page];
   $page_content = "includes/$page.php";
   include('inner.php');
}

对于您的页脚,您可以遍历页面列表。要添加新页面,只需将其添加到数组并创建相应的文件即可。

但要回答您的问题:不,您不能在运行时分析代码语句。

【讨论】:

  • 您错过了 OP 请求中最重要的内容 - 自动生成页脚链接。
  • @holodoc。如果你有一个数组而不是一个开关,那很容易。我认为 OP 也应该能够解决这个问题。
  • @holodoc:“对于您的页脚,您只需遍历页面列表即可。”我认为 OP 能够意识到,一个简单的foreach($pages as $id => $name) { /* footer code */ } 就可以做到
【解决方案2】:

不,不可能使用switch - 但您可以将这些信息存储在一个数组中:

$page_list = array(
    'about' => array(
        'title' => 'About Us',
        'content' => 'includes/about-us.php',
    ),
    'services' => array(
        'title' => 'Services',
        'content' => 'includes/services.php',
    ),
);

if(isset($page_list[$page])) {
    $page_info = $page_list[$page];

    $title_name = $page_info['title'];
    $page_content = $page_info['content'];

    include("inner.php");
} else {
    // 404 - file not found
}

// create links
foreach($page_list as $link_name => $page_ent) {
    echo "<a href=\"/{$link_name}/\">{$page_ent['title']}</a><br />"
}

// output
// <a href="/about/">About Us</a><br />
// <a href="/services/">Services</a><br />

【讨论】:

  • 这正是我会做的。在这种情况下,Switch 并不是特别有用。
  • 太棒了!这很好用。是的,当我开始时,我只是想要一些简单的东西来帮助我更快地工作,我认为切换会很容易并完成工作。但这很棒,非常感谢。
  • 当我想通过表单或其他方式创建新页面时,有没有办法在 $page_list 数组中自动创建一个新数组?
  • 如果您将此类数据存储在代码中,它是完全静态的——使用 PHP 可以动态更改代码,但它会很快变得丑陋。这听起来像是内容管理,需要某种持久性机制来存储您的数据,例如关系数据库(例如 MySQL)或文档存储(NoSQL)。
【解决方案3】:

你有这个倒退。您想要的是拥有一个页面数组,然后为 switch 语句循环一次,为页脚循环一次。或者,更好的是,完全摆脱 switch 语句,而是使用关联数组将页面映射到构建特定页面可能需要的信息(开关之间有很多共同行为,所以知道你的页面是什么,你可能只是从中构造正确的 URL/等)。

【讨论】:

    【解决方案4】:

    您绝对不能从 switch 语句中获取所有值,您将不得不重新设计您的代码。当然有很多方法可以实现这一点,但我通常会做类似下面的事情,这比你的方法更短更容易扩展。

    <?php
    
    $pages = array('home', 'about', 'services', 'faq');
    $titles = array('Home', 'About us', 'Services', 'FAQ');
    
    $index = array_search($_POST['p'], $pages);
    if ($index !== false) {
       $page_content = 'includes/' . $pages[$index] . '.php';
       $title_name = $titles[$index];
    } else {
       print 'Page not found';
    }
    
    ?>
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-09-24
      • 2011-03-28
      • 2018-04-28
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多