HTML表单变量:PHP和Rails上的2D数组差异
在过去的3个月里,我一直在RubyonRails上编写代码,现在我要切换回PHP。当我意识到在RoR上可以像这样创建2D表单变量时,我有点好奇HTML表单变量:PHP和Rails上的2D数组差异,php,html,ruby-on-rails,arrays,Php,Html,Ruby On Rails,Arrays,在过去的3个月里,我一直在RubyonRails上编写代码,现在我要切换回PHP。当我意识到在RoR上可以像这样创建2D表单变量时,我有点好奇 <div> <input type="text" name="persons[][name]"> <input type="text" name="persons[][address]"> </div> <div> <input type="text" name="person
<div>
<input type="text" name="persons[][name]">
<input type="text" name="persons[][address]">
</div>
<div>
<input type="text" name="persons[][name]">
<input type="text" name="persons[][address]">
</div>
<div>
<input type="text" name="persons[0][name]">
<input type="text" name="persons[0][address]">
</div>
<div>
<input type="text" name="persons[1][name]">
<input type="text" name="persons[1][address]">
</div>
其结果是生成一个具有姓名和地址属性的人员数组
但是,在PHP上,第一个索引不能为空。相反,我必须这样做
<div>
<input type="text" name="persons[][name]">
<input type="text" name="persons[][address]">
</div>
<div>
<input type="text" name="persons[][name]">
<input type="text" name="persons[][address]">
</div>
<div>
<input type="text" name="persons[0][name]">
<input type="text" name="persons[0][address]">
</div>
<div>
<input type="text" name="persons[1][name]">
<input type="text" name="persons[1][address]">
</div>
当涉及到动态表单时,当用户可以添加不确定数量的人时,它并不方便。我必须使用javascript在PHP上维护索引
问题:为什么存在这种差异?这有什么区别?这是一种语言功能吗?这不是一个真正的语言问题,而是一个框架问题-对于表单名称属性如何映射到数据结构没有实际的标准-使用方括号语法将名称映射到哈希或数组的模式可以追溯到早期的web框架 注意我是如何说这是一个框架问题的;PHP不仅仅是一种语言——它的许多web框架都以不同的质量固定在语言的核心上,比如它自动将查询字符串和请求体解析为
$\u GET
和$\u POST
超全局(以及极端的facepalm,即register\u globals
)
我相信PHP不会将persons[][name]
解析为以下内容的原因:
array(
array(
array(
"name" => "foo"
)
)
)
这是由于PHP数组的怪癖——PHP中的数组确实是一个奇怪的野兽,实际上是一个有序映射——因此PHP中的“一维数组”实际上是:
array(
0 => 'A',
1 => 'B',
2 => 'C'
)
这使得解析
persons[0][name]
变得更简单了。我已经放弃了在PHP中寻找逻辑设计的尝试——这只是一种惰性语言的设计。如果它能工作,它就能工作——否则我们就在上面扔一些胶水代码。