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?

Ответ 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;
}

& передает значение массива в качестве ссылки и не создает новый экземпляр переменной. Таким образом, если вы измените ссылку, исходное значение изменится.

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

Ответ 3

Используйте foreach($fields as &$field){ - чтобы вы работали с исходным массивом.

Здесь речь идет о передаче по ссылке.

Ответ 4

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

Это то, что я предлагаю пройти по ссылке

Ответ 5

Попробуйте это

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