PHP中的多维数组(带有复选框的表单数据)

PHP中的多维数组(带有复选框的表单数据),php,arrays,checkbox,Php,Arrays,Checkbox,我是PHP新手,在阅读表单提交的复选框时遇到问题。在解释之前,我想提一下,我正在尝试编辑一个更大的应用程序,数据不能以任何其他方式发送。这只是找到一种好的阅读方法的问题 发送普通文本输入时,表单将发布以下内容: custom[0][type]="text" custom[0][name]="VariableName" custom[0][value]="VariableName" 基本上有一个主要的“自定义”多维数组,它有几个元素(0、1、2、3等),每个元素都有名称和值 但是,当其中一个元素

我是PHP新手,在阅读表单提交的复选框时遇到问题。在解释之前,我想提一下,我正在尝试编辑一个更大的应用程序,数据不能以任何其他方式发送。这只是找到一种好的阅读方法的问题

发送普通文本输入时,表单将发布以下内容:

custom[0][type]="text"
custom[0][name]="VariableName"
custom[0][value]="VariableName"
基本上有一个主要的“自定义”多维数组,它有几个元素(0、1、2、3等),每个元素都有名称和值

但是,当其中一个元素是复选框时,将发布以下内容:

custom[1][type]="list"
custom[1][name]="SelectedOptions"
custom[1][value]="Value1"
custom[1][value]="Value3"
custom[1][value]="Value5"
说到PHP方面,这是我用来读取表单发送的数据的代码。下面的代码在场景1中工作正常(使用基于文本的输入),但当我们有列表类型的自定义数据时,只读取一个值

foreach($_POST['custom'] as $item){
    if($item['value'] != "") echo $item['name'].'='.$item['value']
}
问题是$item['value']只读取其中一个值,而不是全部3个值。如何获取变量中的所有3个值?这可能是一件很容易的事

将其全部组合在一起,这就是它随POST发送的内容(选中3个复选框中的Variable2)

这就是打印($\u POST)为上面发布的数据显示的内容

[custom] => Array
(
[0] => Array
    (
    [value] => ValueForVariable1
    [name] => Variable1
    [type] => text
    )
[1] => Array
    (
    [value] => Value1
    [name] => Variable2
    [type] => checkbox
    )
为了确保我们都在同一页上,实际数据是由一个更复杂的系统生成的,我们无法真正改变这一点。我感兴趣的是看看我们如何读取文章中发送的变量2的所有3个值

谢谢

编辑: 从你提供的额外信息来看,我发现我最初误解了这个问题

由于您无法控制将数据发送到PHP脚本的表单,因此无法更改表单以确保具有相同名称的后面的复选框不会覆盖前面的复选框,因此您必须访问并处理原始post数据本身

$postdata = file_get_contents("php://input");
echo $postdata;
。。。将像GET查询字符串一样输出postdata:
blah=1&blah=2&blah=3
(blah表示3个具有相同名称blah的表单字段,其中前两个字段将在
$\u POST
中被覆盖,留下
$\u POST['blah']=3
)。 在
&
上进行一点分解,循环和解析以查找有问题的变量,甚至任何冲突的变量,将使您达到您想要达到的目的


原始答案:

HTML表单仅提交已选中的复选框(或单选按钮)。如果尚未检查,浏览器将不会将数据发送回服务器

解决这个问题的主要方法是了解您在后端寻找什么,并测试它(即
if(isset($\u POST['checkboxname'))

如果您确实需要一个通用后端,它将动态地合并所有复选框元素(无论是否选中),我过去解决这个问题的方法是使用javascript记录页面上的所有表单元素,并将该信息与表单的其余部分一起提交(在我的情况下,还可以提交该字段是否更改)


这里有一个函数,您可以在脚本顶部运行,以从ASP后台处理POST的方式处理POST:

function post_process() {
    $rawpostdata = file_get_contents('php://input');
    if (!$rawpostdata) return;
    $fields = explode('&', $rawpostdata);
    $post = array();
    foreach ($fields as $field) {
        list($key, $val) = explode('=', $field);
        if (isset($post[$key])) $post[$key] .= ','.$val;
        else $post[$key] = $val;
    }
    $_POST = $post;
}

print\r($\u POST)
到底产生了什么?(仅此区块是可以的)如果我正确理解您的命名,复选框名称将不正确。复选框名称必须是自定义的[1][value][]或者您将用最后一个值覆盖该值。@jcmeloni-我已编辑了问题并添加了打印数据。@Rufinus-仅凭我的基本php知识,我正在使用的系统中似乎有很多错误,但现在我必须完成这项工作。请再次阅读我的第一条评论…..当然,您可以在firebug中阅读它,它向您展示了发送的内容,但当php组装数组时,它会完全按照我说的那样做…它会覆盖值。或者使用世界上最古老的技巧,添加一个同名的隐藏字段,并使用value=“0”(如果选中值为1)因此,您总是可以获得所有字段,如果选择了radio/复选框,则0值将被覆盖。@Jason,正如您在发布的数据中所看到的,发布了3个值,这意味着在表单页中选择了3个复选框。@Rufinus在我的特定场景中,我对一直工作的同一代码进行了优化,而不必记得添加(或更改)存在的每个字段的隐藏字段(在数十页上有数百个字段的intranet数据库应用程序),但您是对的,在更有限的范围内(和更常见的范围内)可能更合理的应用程序。@Cornel我知道你在做什么。我可能能为你找到解决方案…@Jason:只是一个如何生成表单的问题…在我的应用程序中,我使用抽象/扩展Zend_表单,当我添加复选框或收音机时,隐藏字段会自动打印出来。
function post_process() {
    $rawpostdata = file_get_contents('php://input');
    if (!$rawpostdata) return;
    $fields = explode('&', $rawpostdata);
    $post = array();
    foreach ($fields as $field) {
        list($key, $val) = explode('=', $field);
        if (isset($post[$key])) $post[$key] .= ','.$val;
        else $post[$key] = $val;
    }
    $_POST = $post;
}