如何消除此PHP代码中的重复?

时间:2010-08-23 18:06:59

标签: php

有没有办法可以检查所有这些值,而无需编写所有这些if语句,然后在此代码示例sub10中获取最后一个值 我怎么能用PHP做到这一点?

这是PHP代码。

if(isset($_GET['sub1'])) {
    $sub1 = $_GET['sub1'];
}

if(isset($_GET['sub2'])) {
    $sub2 = $_GET['sub2'];
}

if(isset($_GET['sub3'])) {
    $sub3 = $_GET['sub3'];
}

if(isset($_GET['sub4'])) {
    $sub4 = $_GET['sub4'];
}

if(isset($_GET['sub5'])) {
    $sub5 = $_GET['sub5'];
}

if(isset($_GET['sub6'])) {
    $sub6 = $_GET['sub6'];
}

if(isset($_GET['sub7'])) {
    $sub7 = $_GET['sub7'];
}

if(isset($_GET['sub8'])) {
    $sub8 = $_GET['sub8'];
}

if(isset($_GET['sub9'])) {
    $sub9 = $_GET['sub9'];
}

if(isset($_GET['sub10'])) {
    $sub10 = $_GET['sub10'];
}

8 个答案:

答案 0 :(得分:4)

您可以使用检查参数的for循环:

for ($i=1; $i<10; ++$i) {
    if (isset($_GET['sub'.$i])) {
        ${'sub'.$i} = $_GET['sub'.$i];
    }
}

语法${'sub'.$i}variable variable syntax,用于引用由表达式'sub'.$i的值标识的变量。

如果您只想要最后一个 subX 参数,请按相反的顺序测试参数:

$sub = null;
for ($i=10; $i>=1; --$i) {
    if (isset($_GET['sub'.$i])) {
        $sub = $_GET['sub'.$i];
        break;
    }
}

答案 1 :(得分:3)

最简单的方法是使用sub[]元素制作表单,如下所示:

Sub 1 <input type="text" name="sub[]" />
Sub 2 <input type="text" name="sub[]" />
Sub 3 <input type="text" name="sub[]" />
Sub 4 <input type="text" name="sub[]" />
Sub 5 <input type="text" name="sub[]" />

PHP会将所有这些组合成一个数组。

然后,要获得最后一个,它将是$_GET['sub'][-1]

编辑:这与NullUserException的作用基本相同,但他直接在网址而不是表单中进行。

答案 2 :(得分:1)

更优雅的解决方案是使用数组和foreach语句。

答案 3 :(得分:1)

/foo.php?sub=1,2,3,4,5

$subs = explode(',', $_GET['sub']);

然后,您可以从$subs[count($subs)-1]array_pop($subs)获取最后一个值,或者您想要的其他值。

答案 4 :(得分:1)

强制变量版本:

$keys = preg_grep('/^sub\d+$/', array_keys($_GET));

foreach ($keys as $key) {
  $$key = $_GET[$key];
}

从好的方面来说:不需要循环到PHP_MAX_INT,因为它只适用于真正存在的东西。向下......变量变量。

答案 5 :(得分:1)

这是一个更明智的解决方案:

演示:http://bit.ly/diY6Pk

URL: http://ablazex.com/demos/multi.php?sub[]=Hello&sub[]=There&sub[]=Angel&sub[]=From&sub[]=My&sub[]=Nightmare

代码:

print_r($_GET['sub']);

$sub = end($_GET['sub']);
echo $sub;

答案 6 :(得分:0)

我试图用extract提出一个解决方案,但它变得非常复杂:

extract(array_intersect_key($_GET, array_flip(array_map(function ($i) { return 'sub' . $i; }, range(1, 10)))));

有没有办法做到这一点?

这是格式化版本:

extract(
    array_intersect_key(
        $_GET,
        array_flip(
            array_map(
                function ($i) {
                    return 'sub' . $i;
                },
                range(1, 10)
            )
        )
    )
);

它的作用:创建一个数字从1到10的数组,用sub作为前缀,然后转动数组(所以变量名现在在数组的键中),然后与数组相交$_GET数组。因此,只提取sub1..10。

答案 7 :(得分:0)

正如dmags所说,我更喜欢使用数组(我经常使用它)。它更优雅(恕我直言),如果您有不同的变量名称(即姓名,地址,城市,国家,邮编等......),也可以使用它。

$vars= array('sub1','sub2','sub3','sub4','sub5','sub6','sub7','sub8','sub9','sub10');
foreach ($vars as $getvar)
    if (isset($_GET[$getvar])) {
        $$getvar= $_GET[$getvar];
    }
}