有效处理x数量$ _POST vars

时间:2012-03-02 10:47:35

标签: php

我有一段我根本不满意的代码:

// Search for checkboxes ('chk-1','chk-2','chk-3'...)
foreach ($_POST as $key => $val) {
    if (substr($key, 0,3) == 'chk') {  
        $appObj->cats[] = intval(substr($key,4,strlen($key)));
}

我真的不喜欢这个,因为$ _POST可以包含超过40个变量,我已经将逻辑应用于所有其他发布的变量。

有没有人有任何想法/解决方案来实现上述目标,而无需循环每一个$ _POST var?

3 个答案:

答案 0 :(得分:1)

尝试在表单控件中使用name =“check []”。

<input type="checkbox" name="chk[]" value="1"> 1<br />
<input type="checkbox" name="chk[]" value="2"> 2<br />
<input type="checkbox" name="chk[]" value="3"> 3<br />

然后检查你是否有阵列。

if( !empty($_POST["chk"]) )
{
    print_r($_POST["chk"]);
}

答案 1 :(得分:1)

通过foreach运行$_POST实际上并非犯罪行为,而且可能是执行此操作的唯一方法。

如果您已经在为其他逻辑添加内容,为什么不将它们全部放在同一个foreach

另外为了节省一些处理,您不需要传递strlen($key)作为substr中的第3个参数,只需完全排除该参数,它就会做同样的事情。

答案 2 :(得分:1)

唯一可以避免通过所有项目并使用strncmpstrpossubstr进行循环的方法是将复选框构建为一个数组(让$key = 7为示例):

<input type="checkbox" name="chk[7]" />

和php:

foreach( $_POST['chk'] as $key => $val){
    $appObj->cats[] = $key;
}

这会,但它可能会造成关键的差距:

$_POST['chk'] = array(
  0 => 'ON',
  1 => 'ON',
  7 => 'ON',
);

当有人尝试使用for循环处理数据时,这可能会导致问题。

更好的方法就是这个:

<input type="checkbox" name="chk[]" value="7" />
<input type="checkbox" name="chk[]" value="57" />
<input type="checkbox" name="chk[]" value="1231" />

和php:

foreach( $_POST['chk'] as $arrayKey => $key){
    $appObj->cats[] = $key;
}