获取switch语句中的案例列表

问题描述 投票:5回答:5

我使用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语句中提供的页面自动将其拉出。

有没有办法做到这一点?自动添加新页面并为新页面添加新案例,并在includes文件夹中自动创建页面也将是一件好事。

[如果有人能指出正确的方向,我将非常感激。根据我的理解,我不相信您可以使用switch语句来做到这一点,我将不得不重新调用页面的方式,对吧?

php dynamic switch-statement
5个回答
5
投票

不,不能使用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 />

8
投票
$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');
}

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

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


0
投票

您有这个倒退。您想要的是拥有一组页面数组,然后在其上循环一次以获取switch语句,并一次遍历至页脚。或者,更好的是,完全摆脱switch语句,而使用关联数组映射页面到构建该特定页面可能需要的信息(这些开关之间有很多共同的行为,因此知道您的页面是什么,可以从中构造适当的URL /等)。


0
投票

您肯定无法从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';
}

?>

希望这有所帮助。


0
投票

可能迟到了聚会,但是当我自己正在寻找答案时,我发现了这个问题,所以我必须建立自己的解决方案。

我的用例是,我有一个Telegram机器人,当从特定帐户接收用户输入时,该机器人会执行多个动作,每个动作都不同。

命令字符串是预先确定的,所以我有一系列类似的情况:

switch(strtolower($text)) {
    case "blah1":
        dosomething1();
        break;
    case "blah2":
        file_put_contents($somefile,2);
        break;
    case "blah3":
        echo file_get_contents($someurl);
        break;
    // [...]
}

我正在添加功能最不相同的新命令,通常我会忘记机器人可以执行的所有操作,因此我想实现一个功能,其中机器人在响应某个命令时会列出所有其他可能的命令(如果可能,可以使用--help排序功能。)>

所以,我知道这很丑陋,您需要精确设置代码格式,但这对我有用:

preg_match_all('/case \\"([a-z0-9\\s]+)\\"/', file_get_contents(__FILE__), $matches);
© www.soinside.com 2019 - 2024. All rights reserved.