包含方括号的表单input字段名称,如字段

我见过很多处理表单input的PHP代码,其中input字段名称包含方括号。 我知道这在PHP脚本检查$ _POSTvariables时以某种方式导致PHP数组。

HTML示例:

<form action='http://zzz.com' method='post'> <input name='fruit[1]' value='apple' /> <input name='fruit[2]' value='banana' /> </form> 

示例url:

 http://zzz.com?fruit[1]=apple&fruit[2]=banana 

示例PHP:

 assert($_POST['fruit'] === array(1=>'apple', 2=>'banana')); 

我的问题是:

  • 它背后的机制是什么? 这些包含括号的名字在什么时候被转换成数组? 这是HTTP协议的function吗? Web服务器? PHP语言的?

  • 继续前面的问题,这是一个常用的黑客或正常的编程工具?

  • 什么是(所有)在input字段名称中使用括号的规则?

  • multidimensional array可以这样创build吗?

什么是背后的机制? 在哪一点,只是包含括号的名称被转换为数组? 这是HTPP协议的function吗? Web服务器? PHP语言的?>

这是PHP语言的一个特性。 实际上,HTTP协议并不禁止使用多个相同的GET / POST参数。 根据HTTP规范,以下内容:

 foo=bar&foo=baz 

不应该导致foo == baz 。 这是两个不同的值的两个参数。 但是,PHP会用最新的代码覆盖前面的foo ,导致$_POST['foo'] == 'baz' ,即使它们可以单独parsing。

继续前面的问题,这是一个常用的黑客或正常的编程工具?

这取决于观点。 在PHP世界中,这是完全正常的,因为不使用括号[] ,语言不支持同名多个参数的说明。 在HTTP世界中, foo != foo[]

什么是(全部)在input字段名称中使用括号的规则?

与PHP数组相同,只是不必引用string键。

multidimensional array可以这样创build吗?

是的你可以。

据我所知,这是PHP内部看到(和parsing)通过forms(GET / POST)和[] postfix传递的元素并将它们解释为元素数组的一种机制。 HTTP协议并不在意,它只是传递元素的名字和它在查询string中的相关值。

在我记忆中,这是一个普通的编程工具(我想我甚至记得它更常用于多file upload时,当你有“添加文件”的链接,附加另一个元素的forms,使用相同的名称与[] )。

适用于PHP的相同规则适用于表单。 您可以使用[]自动索引元素(对于通用列表)或使用元素ID(例如file [1],file [2]等)显式列出它们(按照前面的示例))

是的,可以使用multidimensional array。

有关更多信息,请查看PHP自己的_POST文档 (尤其是注释)

  • 这是完全的PHP语言function。 HTTP对数组一无所知。 在http中, foobar[baz]只是variables的名称

  • 这是一个正常的做法

  • 当它适合你的时候使用它们。 例如:将属于一个实体的几个字段分组,例如news[title] + news[body]

  • 是。 TIAS