我是多维数组中的新手,这让我感到很烦恼。
我的数组如下:
$fields = array(
"names" => array(
"type" => "text",
"class" => "name",
"name" => "name",
"text_before" => "name",
"value" => "",
"required" => true,
)
)
然后我得到一个函数,检查是否填写了这些输入,如果需要的话。
function checkForm($fields){
foreach($fields as $field){
if($field['required'] && strlen($_POST[$field['name']]) <= 0){
$fields[$field]['value'] = "Some error";
}
}
return $fields;
}
现在我的问题是这一行
$fields[$field]['value'] = "Some error";
我想更改原始数组的内容,因为我要返回它,但是如何在foreach循环中获取当前数组的名称(本例中的名称)?
答案 0 :(得分:216)
我建议您执行以下操作:
foreach ($fields as $key => $field) {
if ($field['required'] && strlen($_POST[$field['name']]) <= 0) {
$fields[$key]['value'] = "Some error";
}
}
因此,当您需要值时,基本上使用$field
,而当您需要更改数据时,请$fields[$key]
。
答案 1 :(得分:125)
使用&
:
foreach($arr as &$value)
{
$value = $newVal;
}
&
传递数组的值作为引用,不会创建变量的新实例。因此,如果您更改参考,原始值将会更改。
http://php.net/manual/en/language.references.pass.php
编辑2018
这个答案似乎受到互联网上很多人的青睐,这就是为什么我决定添加更多信息和谨慎的话。
虽然在foreach
(或函数)中通过引用传递是一个干净而简短的解决方案,但对于许多初学者来说,这可能是一个危险的陷阱。
PHP中的循环没有自己的范围。 - @Mark Amery
当变量在同一范围内重用时,这可能是一个严重的问题。 Another SO question nicely illustrates why that might be a problem.
因为foreach依赖于PHP 5中的内部数组指针,所以改变它 循环内可能会导致意外行为。 - foreach的PHP文档
在同一循环的迭代过程中取消设置记录或更改哈希值(键)可能会导致PHP中的潜在意外行为&lt; 7.当数组本身作为参考时,问题变得更加复杂。
Foreach表现。
通常,由于写时复制功能,PHP更喜欢按值传递。这意味着内部PHP不会创建重复数据,除非需要更改它的副本。在foreach
中通过引用传递是否会提高性能是有争议的。总是如此,您需要测试您的特定方案并确定哪个选项使用更少的内存和CPU时间。有关更多信息,请参阅NikiC下面链接的SO帖子。
代码可读性。
在PHP中创建引用很快就会失控。如果您是新手并且无法完全控制您正在做的事情,最好远离参考。有关&
运算符的详细信息,请查看本指南:Reference — What does this symbol mean in PHP?
对于那些想要了解PHP语言的这一部分的人:PHP References Explained
@NikiC对PHP foreach循环内部逻辑的一个非常好的技术解释:
How does PHP 'foreach' actually work?
答案 2 :(得分:12)
使用foreach($fields as &$field){
- 这样您就可以使用原始数组。
Here更多的是通过引用传递。
答案 3 :(得分:0)
function checkForm(& $fields){
foreach($fields as $field){
if($field['required'] && strlen($_POST[$field['name']]) <= 0){
$fields[$field]['value'] = "Some error";
}
}
return $fields;
}
这就是我建议通过引用传递
答案 4 :(得分:-5)
试试这个
function checkForm($fields){
foreach($fields as $field){
if($field['required'] && strlen($_POST[$field['name']]) <= 0){
$field['value'] = "Some error";
}
}
return $field;
}