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?

В PHP прохождение по ссылке ( & ) … противоречиво. Я рекомендую не использовать его, если вы не знаете, зачем вам это нужно, и проверьте результаты.

Я бы рекомендовал сделать следующее:

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

Поэтому в основном используйте $field когда вам нужны значения, и $fields[$key] когда вам нужно изменить данные.

Использовать & :

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

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

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

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

Подробнее о передаче по ссылке.

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

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

Попробуй это

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