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 петля?

5 99

5 ответов:

в 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;
    }