PHP foreach 更改原始数组值

2022-08-30 06:35:40

我在多维数组方面非常陌生,这让我很烦恼。

我的数组如下:

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


答案 1

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

我建议执行以下操作:

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

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


答案 2

用:&

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

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

用于通过引用传递的 PHP 文档

编辑2018年

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

  1. PHP 中的循环没有自己的作用域。- @Mark阿梅里

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

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

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

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

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

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