开关/外壳的替代方案,以减少程序行

时间:2013-11-03 13:31:26

标签: php switch-statement

这里没有太熟练的PHP程序员.. 我的网站上有截屏系统。使用GET和'switch'我决定从链接参数查看屏幕截图。像这样:

    switch($_GET['scid']) {
    case "1":
    $sc_id_txt = "Default screenshot";
    $picname = "u0"; //Image name
    break;
    case "2":
    $sc_id_txt = "Screenshot no 2";
    $picname = "2";
    break;
    case "3":
    etc..

(最多)20个屏幕截图的大量代码..此外,我希望系统每个项目最多可以有100个屏幕截图。

有更好的方法可以用更少的代码行来实现上述目标吗?

3 个答案:

答案 0 :(得分:3)

如果您有大量数据并且它是动态的 - 请考虑使用数据库。 如果这些值是静态的,或者您只是不想要数据库, 使用数组来存储这些值。

$screenshots = array(
1 => array('txt' => 'Default Screenshot','pic' => 'u0'),
2 => array('txt' => 'Screenshot2','pic' => '2')
);

$scid = (int)$_GET['scid'];
if($scid == 0 || !array_key_exists($scid, $screenshots))
{
 //Error.
}
else
{
 $screenshot = $screenshots[$scid];
 echo $screenshot['txt'];
 echo $screenshot['pic'];
}

答案 1 :(得分:1)

我认为你不需要更短的替代SWITCH - 你需要DRY(不要重复自己)。

一个例子:

案例2& 3

[...]
case "2":
    $sc_id_txt = "Screenshot no 2";
    $picname = "2";
    break;
case "3":
    $sc_id_txt = "Screenshot no 3";
    $picname = "3";
    break;
case "4": 
[...]

这个dosnt有意义重复..

所以就这样做吧

$scid = (int)$_GET['scid'];
[...]
else if(1 <= $scid and $scid <= 20) {
   $sc_id_text = "Screenshot no {$scid}";
   $pic_name = $scid;
}
[...]

答案 2 :(得分:1)

如果其余的都遵循相同的模式,则只需要一个if-else:

$scid = (int)$_GET['scid'];
if ($scid == 1) {
    $sc_id_txt = "Default screenshot";
    $picname = "u0";
} else if ($scid > 1 && $scid <= 100) {
    $sc_id_txt = "Screenshot no " . $scid;
    $picname = (string)$scid;
}