PHP foreach zmienia oryginalne wartości tablicy

Jestem zupełnie nowy w wielowymiarowych tablicach, i to mnie męczy.

Moja tablica jest następująca:

$fields = array(
    "names" => array(
         "type"         => "text",
         "class"        => "name",
         "name"         => "name",
         "text_before"  => "name",
         "value"        => "",
         "required"     => true,
    )
)

Potem dostaĹ 'em funkcjÄ ™ sprawdzajÄ ... cÄ..., czy te wejĹ" cia sÄ ... wypeĹ 'nione, jeĹ" li sÄ ... wymagane.

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

Teraz moim problemem jest ta linia

$fields[$field]['value'] = "Some error";

Chcę zmienić zawartość oryginalnej tablicy, ponieważ zwracam to, ale jak uzyskać nazwę bieżącej tablicy (nazwy w tym przykładzie) w mojej pętli foreach?

Author: Mujahed AKAS, 2013-02-22

5 answers

W PHP przejście przez referencję (&) jest ... kontrowersyjne. Polecam nie używać go, chyba że wiesz, dlaczego go potrzebujesz i przetestuj wyniki.

Polecam wykonanie:

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

Więc zasadniczo używaj $field, Gdy potrzebujesz wartości, i $fields[$key], gdy musisz zmienić dane.

 183
Author: Vlad Preda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-09 13:30:21

Użycie &:

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

& przekazuje wartość tablicy jako odniesienie i nie tworzy nowej instancji zmiennej. Tak więc, jeśli zmienisz odniesienie, oryginalna wartość ulegnie zmianie.

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

 98
Author: Dharman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-22 12:49:00

Użyj foreach($fields as &$field){ - więc będziesz pracować z oryginalną tablicą.

Tutaj jest więcej o przechodzeniu przez odniesienie.

 11
Author: k102,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-22 12:48:35
function checkForm(& $fields){
    foreach($fields as $field){
        if($field['required'] && strlen($_POST[$field['name']]) <= 0){
            $fields[$field]['value'] = "Some error";
        }
    }
    return $fields;
}

To jest to, co proponuję przekazać przez odniesienie

 2
Author: Sagar Kadam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-22 12:56:25

Spróbuj tego

function checkForm($fields){
        foreach($fields as $field){
            if($field['required'] && strlen($_POST[$field['name']]) <= 0){
                $field['value'] = "Some error";
            }
        }
        return $field;
    }
 -4
Author: Nirmal Ram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-22 12:51:14