Я новичок в многомерных массивах, и это меня сильно беспокоит.
Мой массив выглядит следующим образом:
$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
должен вызывать споры? Это не похоже на вызов функции со скрытыми побочными эффектами или чем-то еще.Использование
&
:foreach($arr as &$value) { $value = $newVal; }
&
передает значение массива как ссылку и не создает новый экземпляр переменной. Таким образом, если вы измените ссылку, исходное значение изменится.Документация PHP для передачи по ссылке
Редактировать 2018
Этот ответ, похоже, одобряется многими людьми в Интернете, поэтому я решил добавить больше информации и предостережения.
Хотя передача по ссылке в
foreach
(или функциях) является простым и коротким решением, для многих новичков это может быть опасной ловушкой.Это может стать серьезной проблемой, если переменные повторно используются в одной и той же области. Другой вопрос SO хорошо иллюстрирует, почему это может быть проблемой .
Удаление записи или изменение значения хеш-функции (ключа) во время итерации того же цикла может привести к потенциально неожиданному поведению в PHP <7. Проблема становится еще более сложной, когда сам массив является ссылкой.
Производительность по каждому.
В общем, PHP предпочитает передачу по значению из-за функции копирования при записи. Это означает, что внутренне PHP не будет создавать повторяющиеся данные, если только их копию не нужно изменить. Спорный вопрос,
foreach
даст ли передача по ссылке в улучшении производительности. Как всегда, вам необходимо протестировать свой конкретный сценарий и определить, какой вариант использует меньше памяти и процессорного времени. Для получения дополнительной информации см. Сообщение SO, указанное ниже NikiC.Читаемость кода.
Создание ссылок в PHP - это то, что быстро выходит из-под контроля. Если вы новичок и не полностью контролируете то, что делаете, лучше держаться подальше от рекомендаций. Дополнительные сведения об
&
операторе см. В этом руководстве: Справка - что означает этот символ в PHP?Для тех, кто хочет узнать больше об этой части языка PHP: Объяснение ссылок на PHP
Очень хорошее техническое объяснение внутренней логики
foreach
циклов PHP от @NikiC :как на самом деле работает PHP foreach?
источник
unset($value);
послеforeach
закрывающей скобки, чтобы гарантировать, что переменная по ссылке больше не доступна после итерации. 3v4l.org/2V2AQИспользуйте
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; }
Это то, что я бы посоветовал передать по ссылке
источник
$fields
?Попробуй это
function checkForm($fields){ foreach($fields as $field){ if($field['required'] && strlen($_POST[$field['name']]) <= 0){ $field['value'] = "Some error"; } } return $field; }
источник