PHP foreach更改原始数组值

时间:2013-02-22 12:47:39

标签: php arrays 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循环中获取当前数组的名称(本例中的名称)?

5 个答案:

答案 0 :(得分:216)

In PHP, passing by reference (&) is ... controversial. I recommend not using it unless you know why you need it and test the results.

我建议您执行以下操作:

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(或函数)中通过引用传递是一个干净而简短的解决方案,但对于许多初学者来说,这可能是一个危险的陷阱。

  1.   

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

    当变量在同一范围内重用时,这可能是一个严重的问题。 Another SO question nicely illustrates why that might be a problem.

  2.   

    因为foreach依赖于PHP 5中的内部数组指针,所以改变它   循环内可能会导致意外行为。 - foreach的PHP文档

    在同一循环的迭代过程中取消设置记录或更改哈希值(键)可能会导致PHP中的潜在意外行为&lt; 7.当数组本身作为参考时,问题变得更加复杂。

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

  4. 代码可读性。
    在PHP中创建引用很快就会失控。如果您是新手并且无法完全控制您正在做的事情,最好远离参考。有关&运算符的详细信息,请查看本指南:Reference — What does this symbol mean in PHP?
    对于那些想要了解PHP语言的这一部分的人:PHP References Explained

  5. @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;
    }