PHP foreach 更改原始数组值

我在多维数组方面还是个新手,这让我很头疼。

我的数组如下:

$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 循环中获取当前数组的名称(本例中的名称)呢?

239368 次浏览

使用 foreach($fields as &$field){-这样您将使用原始数组。

这里 更多的是关于通过引用传递。

使用 &:

foreach($arr as &$value) {
$value = $newVal;
}
unset($value);

&将数组的值作为引用传递,并且不创建变量的新实例。因此,如果更改引用,原始值将更改。

通过引用传递的 PHP 文档

编辑2018

这个答案似乎受到网上很多人的青睐,这就是为什么我决定添加更多的信息和警告的话。
虽然 foreach(或函数)中的引用传递(pass-by-reference)是一种简洁的解决方案,但对于许多初学者来说,这可能是一个危险的陷阱。

  1. PHP 中的循环没有自己的作用域

    当变量在同一范围内重用时,这可能是一个严重的问题。

  2. 由于 foreach 依赖于 PHP5中的内部数组指针,因此需要更改它 在循环中可能会导致意外的行为。

    在同一个循环的迭代过程中,取消记录或更改散列值(键)可能会导致 PHP < 7中潜在的意外行为。当数组本身是一个引用时,问题变得更加复杂。

  3. 前场表演。
    通常,PHP 更喜欢按值传递,因为它具有即写即拷的特性。这意味着 PHP 不会在内部创建重复数据,除非需要更改其副本。在 foreach中引用传递是否会提供任何性能改进是有争议的。像往常一样,您需要测试您的特定场景,并确定哪个选项使用更少的内存和 CPU 时间。欲了解更多信息,请参阅以下由 NikiC 链接的 SO 帖子。

  4. 代码可读性。
    在 PHP 中创建引用很快就会失控。如果你是一个新手,不能完全控制你正在做的事情,最好远离推荐信。有关 &操作符的更多信息,请参阅本指南: 参考文献ーー这个符号在 PHP 中的意思是什么?
    对于那些想了解更多关于 PHP 语言这一部分的人来说: 解释 PHP 引用

@ NikiC 对 PHP foreach循环的内部逻辑做了一个非常好的技术解释:
PHP 实际上是如何工作的?

试试这个

function checkForm($fields){
foreach($fields as $field){
if($field['required'] && strlen($_POST[$field['name']]) <= 0){
$field['value'] = "Some error";
}
}
return $field;
}

在 PHP 中,引用传递(&)是有争议的。我建议不要使用它,除非你知道为什么你需要它,并测试的结果。

我建议采取以下措施:

foreach ($fields as $key => $field) {
if ($field['required'] && strlen($_POST[$field['name']]) <= 0) {
$fields[$key]['value'] = "Some error";
}
}

因此,基本上在需要值时使用 $field,在需要更改数据时使用 $fields[$key]

function checkForm(& $fields){
foreach($fields as $field){
if($field['required'] && strlen($_POST[$field['name']]) <= 0){
$fields[$field]['value'] = "Some error";
}
}
return $fields;
}

这是我建议通过参考的