171

我对多维数组很陌生,这让我很困扰。

我的数组如下:

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

4

5 回答 5

309

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

我建议执行以下操作:

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

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

于 2013-02-22T12:51:30.760 回答
206

使用&

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

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

通过引用传递的 PHP 文档

编辑 2018

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

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

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

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

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

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

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

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

于 2013-02-22T12:49:00.867 回答
15

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

这里有更多关于通过引用传递的信息。

于 2013-02-22T12:48:35.203 回答
1
function checkForm(& $fields){
    foreach($fields as $field){
        if($field['required'] && strlen($_POST[$field['name']]) <= 0){
            $fields[$field]['value'] = "Some error";
        }
    }
    return $fields;
}

这就是我建议通过引用传递的内容

于 2013-02-22T12:56:25.100 回答
-7

试试这个

function checkForm($fields){
        foreach($fields as $field){
            if($field['required'] && strlen($_POST[$field['name']]) <= 0){
                $field['value'] = "Some error";
            }
        }
        return $field;
    }
于 2013-02-22T12:51:14.020 回答