Jestem bardzo nowy w wielowymiarowych tablicach i bardzo mnie to niepokoi.
Moja tablica wygląda następująco:
$fields = array(
"names" => array(
"type" => "text",
"class" => "name",
"name" => "name",
"text_before" => "name",
"value" => "",
"required" => true,
)
)
Następnie dostałem funkcję sprawdzającą, czy te dane wejściowe 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?
Odpowiedzi:
W PHP przekazywanie przez referencję (
&
) jest ... kontrowersyjne. Nie radzę go używać, chyba że wiesz, dlaczego go potrzebujesz i przetestujesz wyniki.Poleciłbym wykonanie następujących czynności:
Zasadniczo używaj,
$field
gdy potrzebujesz wartości i$fields[$key]
kiedy musisz zmienić dane.źródło
foreach
powinno być kontrowersyjne? To nie jest tak, że jest to wywołanie funkcji z ukrytymi efektami ubocznymi czy cokolwiek.Zastosowanie
&
:&
przekazuje wartość tablicy jako odniesienie i nie tworzy nowego wystąpienia zmiennej. Dlatego jeśli zmienisz odniesienie, oryginalna wartość ulegnie zmianie.http://php.net/manual/en/language.references.pass.php
Edit 2018
Wydaje się, że ta odpowiedź jest faworyzowana przez wiele osób w Internecie, dlatego postanowiłem dodać więcej informacji i słów przestrogi.
Chociaż przekazywanie przez odniesienie w
foreach
(lub funkcjach) jest czystym i krótkim rozwiązaniem, dla wielu początkujących może to być niebezpieczna pułapka.Może to stanowić poważny problem, gdy zmienne są ponownie używane w tym samym zakresie. Kolejne pytanie SO dobrze ilustruje, dlaczego może to być problem.
Cofnięcie rekordu lub zmiana wartości skrótu (klucza) podczas iteracji w tej samej pętli może prowadzić do potencjalnie nieoczekiwanych zachowań w PHP <7. Problem staje się jeszcze bardziej skomplikowany, gdy sama tablica jest referencją.
Wydajność dla wszystkich.
Ogólnie PHP preferuje przekazywanie wartości ze względu na funkcję kopiowania przy zapisie. Oznacza to, że wewnętrznie PHP nie utworzy zduplikowanych danych, chyba że ich kopia będzie wymagać zmiany. Dyskusyjne jest, czy przekazanie przez odniesienie
foreach
zapewniłoby poprawę wydajności. Jak zawsze, musisz przetestować swój konkretny scenariusz i określić, która opcja zużywa mniej pamięci i czasu procesora. Aby uzyskać więcej informacji, zobacz post dotyczący SO, do którego link NikiC zamieszcza poniżej.Czytelność kodu.
Tworzenie referencji w PHP to coś, co szybko wymyka się spod kontroli. Jeśli jesteś nowicjuszem i nie masz pełnej kontroli nad tym, co robisz, najlepiej trzymać się z dala od odniesień. Więcej informacji o
&
operatorze znajdziesz w tym przewodniku: Odniesienie - Co ten symbol oznacza w PHP?Dla tych, którzy chcą dowiedzieć się więcej o tej części języka PHP : Wyjaśnienie referencji PHP
Bardzo ładne techniczne wyjaśnienie autorstwa @NikiC wewnętrznej logiki pętli foreach PHP:
Jak właściwie działa PHP „foreach”?
źródło
unset($value);
poforeach
nawiasie zamykającym, aby zmienna przez odniesienie nie była już dostępna po iteracji. 3v4l.org/2V2AQUżyj
foreach($fields as &$field){
- dzięki czemu będziesz pracować z oryginalną tablicą.Tutaj jest więcej o przekazywaniu przez odniesienie.
źródło
To właśnie sugerowałbym przekazać przez odniesienie
źródło
$fields
?Spróbuj tego
źródło