HTML表单变量:PHP和Rails上的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

在过去的3个月里,我一直在RubyonRails上编写代码,现在我要切换回PHP。当我意识到在RoR上可以像这样创建2D表单变量时,我有点好奇

<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中寻找逻辑设计的尝试——这只是一种惰性语言的设计。如果它能工作,它就能工作——否则我们就在上面扔一些胶水代码。