在 foreach 循环中获取当前数组键

4

好的,我正在为我的雇主构建一个输入产品的系统,他们有非常具体的要求。我有一个表单,其中包含动态生成的字段,如下所示... (显然不是完全相同的代码示例,但概念相同)

<input type="text" name="attribute[20]"> inputted value = height
<input type="text" name="attribute[27]"> inputted value = width

这些数字是基于数据库中的内容生成的,例如20对应“宽度”,27对应“高度”。

因此,一旦用户输入了这些值,我就需要将这些值存入数据库...或在测试中输出。

foreach ($_POST['attribute'] as $attributes){
echo key($attributes).' '.$attributes.'<br>';
}

那么输出应该是...
20 height value<br>
27 width value

但实际输出的是...
&nbsp;height value<br>
&nbsp;width value

发生了什么?我有类似的问题...但是定义的数字可以有多个输入....这个也完美地解决了。

<input type="text" name="option[][20]"> inputted value = option 1
<input type="text" name="option[][20]"> inputted value = option 2
<input type="text" name="option[][27]"> inputted value = option 1

foreach ($_POST['option'] as $options){
echo key($options).' ';
foreach ($options as $option){
echo $option.'<br>';
}

这段代码可以完美输出...

20 option 1<br>
20 option 2<br>
27 option 1

我不明白为什么更复杂的代码可以工作,而更简单的却不能。我知道我的编码方法有点与众不同,但这就是它的样子,哈哈。非常感谢任何帮助。
编辑:按要求进行变量转储
数组(22) { ["pID"]=> string(12) "test product" ["pPrice"]=> string(0) "" ["pName"]=> string(0) "" ["pRRP"]=> string(0) "" ["pPostSize"]=> string(0) "" ["pOurPrice"]=> string(0) "" ["pEstDelivery"]=> string(0) "" ["pWeight"]=> string(0) "" ["pEAN"]=> string(0) "" ["pOrder"]=> string(0) "" ["pStock"]=> string(0) "" ["pManufacturer"]=> string(0) "" ["pType"]=> string(13) "Shower Valves" ["pRange"]=> string(0) "" ["cat"]=> array(2) { [0]=> string(2) "72" [1]=> string(2) "23" } ["attribute"]=> array(2) { [0]=> string(5) "width" [1]=> string(6) "height" } ["option"]=> array(3) { [0]=> array(1) { [11]=> string(6) "works1" } [1]=> array(1) { [10]=> string(6) "works1" } [2]=> array(1) { [10]=> string(6) "works2" } } ["pLongdescription"]=> string(0) "" ["meta_description"]=> string(0) "" ["meta_keyword"]=> string(0) "" ["meta_title"]=> string(0) "" ["action"]=> string(6) "create" }
粗体部分是第二个例子中成功输出的部分。但是,斜体加粗部分返回0,而实际上表单名称值为20。

能否稍微格式化一下你的转储?它现在看起来很难读!(插入一些换行符,缩进子数组等) - Veger
不需要了,多亏了Jim和你提供的建议,现在一切都正常运行。尽管你的语气有点傲慢,但还是要谢谢你。 - GestaltO
很高兴我们能帮助你更好地理解它! - Veger
3个回答

14
<input type="text" name="attribute[20]"> inputted value = height
<input type="text" name="attribute[27]"> inputted value = width

foreach ($_POST['attribute'] as $attributes){
    echo key($attributes).' '.$attributes.'<br>';
}

请注意,您正在遍历帖子中的属性数组。 $attributes是每个字段的值(因此不是数组)。

请尝试使用以下方法而不是使用key()

foreach ($_POST['attribute'] as $attributeKey => $attributes){
    echo $attributeKey.' '.$attributes.'<br>';
}

不好意思,我之前尝试过类似的操作,刚刚又试了一遍以防之前出错。但输出结果是:0 值<br> 1 值而不是:20 值<br> 27 值:( - GestaltO

2
根据PHP的key()函数文档key()函数只是返回当前被内部指针指向的数组元素的键。它不会以任何方式移动指针。如果指针指向元素列表的末尾或数组为空,则key()返回NULL
文档(和示例)显示您需要将实际数组作为参数提供,而在使用值时则需要使用该数组。
因此,请使用以下内容:
$yourArray = $_POST['attribute'];
foreach ($yourArray as $attributes){
  echo key($yourArray).' '.$attributes.'<br>';
}

即使你已经注意到自己的编码方法与其他人有些不同,但最好还是按照以下方式使用foreach循环:

foreach ($_POST['attribute'] as $attributeKey => $attributes){
    echo $attributeKey.' '.$attributes.'<br>';
}

作为我来说,key()方法似乎有些“不可靠”(取决于内部指针)。请查看foreach文档以获取更多关于此用法的信息。

不对,这会输出0 value1 0 value2。就像我说的,在我的第二个例子中使用key()函数就可以完美地解决问题了!非常令人困惑。 - GestaltO
你的第二个例子是偶然起作用的,可能是因为你在第二个foreach循环中使用了$options数组... :) 如文档所述,你需要将数组作为key()参数提供,并将数组作为参数提供。 - Veger
但是我尝试过了,它仍然不能做到我想要的,哈哈。第二个例子可能是偶然成功的,但它确实做到了我想要的 ;) - GestaltO
在您的第二个“工作”示例中,echo key($options) 应该显示第一个数组维度的键。这些键没有设置,应该返回空值。相反,它们幸运地显示了您在第二个foreach循环中使用的2D数组的第二个维度的值,因为您在其中使用了 $options... 如果您对此结果感到满意,请随意使用... :) 但是不要期望这种类型的“幸运”适用于您的第一个代码示例! - Veger
啊,我明白你的意思了。实际上,我尝试使用二维方法来模仿工作示例,结果正如你所描述的那样,返回了空值。 - GestaltO

2

好的,我已经修复了它。在你们的帮助下,我意识到我有点糊涂,并且只编辑了表单的静态部分以包含动态密钥,而没有编辑覆盖它的ajax生成的部分。

foreach ($_POST['attribute'] as $key => $attributes){
echo $key.'+'.$attributes.'<br>';
}

完美地运作了,感谢大家的建议。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接