PHP foreach更改原始数组值

Jep*_*ppe 127 php arrays foreach

我是多维数组中的新手,这让我很烦恼.

我的数组如下:

$fields = array(
    "names" => array(
         "type"         => "text",
         "class"        => "name",
         "name"         => "name",
         "text_before"  => "name",
         "value"        => "",
         "required"     => true,
    )
)
Run Code Online (Sandbox Code Playgroud)

然后我得到一个函数检查是否填写了这些输入,如果需要的话.

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

现在我的问题是这一行

$fields[$field]['value'] = "Some error";
Run Code Online (Sandbox Code Playgroud)

我想更改原始数组的内容,因为我正在返回它,但是如何在foreach循环中获取当前数组的名称(本例中的名称)?

Vla*_*eda 233

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

我建议你做以下事情:

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

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

  • 底线:如果您要更改数组/变量 - 那么您应该使用引用.它更快,更清晰,更易读. (4认同)
  • 我很好奇为什么在“ foreach”中引用传递引用会引起争议?它不像是带有隐藏副作用或其他任何东西的函数调用。 (2认同)

Dha*_*man 139

用途&:

foreach($arr as &$value)
{
     $value = $newVal;
}
Run Code Online (Sandbox Code Playgroud)

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

http://php.net/manual/en/language.references.pass.php

编辑2018
这个答案似乎受到互联网上很多人的青睐,这就是为什么我决定添加更多信息和谨慎的话.
虽然在foreach(或函数)中通过引用是一个干净而简短的解决方案,但对于许多初学者来说,这可能是一个危险的陷阱.

  1. PHP中的循环没有自己的范围. - @Mark Amery

    当变量在同一范围内重用时,这可能是一个严重的问题.另一个SO问题很好地说明了为什么这可能是一个问题.

  2. 由于foreach依赖于PHP 5中的内部数组指针,因此在循环中更改它可能会导致意外行为. - foreach的PHP文档

    在同一循环的迭代期间取消设置记录或更改哈希值(键)可能会导致PHP <7中的潜在意外行为.当阵列本身是引用时,问题会变得更加复杂.

  3. Foreach表现.
    通常,由于写时复制功能,PHP更喜欢按值传递.这意味着内部PHP不会创建重复数据,除非需要更改它的副本.是否通过引用foreach提供性能改进是有争议的.总是如此,您需要测试您的特定方案并确定哪个选项使用更少的内存和CPU时间.有关更多信息,请参阅NikiC下面链接的SO帖子.

  4. 代码可读性.
    在PHP中创建引用很快就会失控.如果您是新手并且无法完全控制您正在做的事情,最好远离参考.有关&运算符的更多信息,请查看本指南:参考 - 此符号在PHP中的含义是什么?
    对于那些想要了解PHP语言的这一部分的人:PHP参考资料解释

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

  • 除了列出的问题之外,我建议在“foreach”右括号后添加“unset($value);”,以确保迭代后引用变量不再可用。https://3v4l.org/2V2AQ (4认同)

k10*_*102 14

使用foreach($fields as &$field){- 这样您就可以使用原始数组.

这里有更多关于通过引用传递.


归档时间:

查看次数:

162116 次

最近记录:

6 年,9 月 前