Zastanawiałem się, czy można edytować bieżący obiekt, który jest obsługiwany w foreach
pętli
Pracuję z tablicą obiektów $questions
i chcę przejrzeć i poszukać odpowiedzi związanych z tym obiektem pytania w mojej bazie danych. Więc dla każdego pytania pobierz obiekty odpowiedzi i zaktualizuj prąd $question
wewnątrz mojej foreach
pętli, aby móc wyprowadzać / przetwarzać gdzie indziej.
foreach($questions as $question){
$question['answers'] = $answers_model->get_answers_by_question_id($question['question_id']);
}
Odpowiedzi:
Można to zrobić na dwa sposoby
W ten sposób zapiszesz klucz, aby móc go ponownie zaktualizować w głównej
$questions
zmiennejlub
Dodanie
&
będzie utrzymywać$questions
aktualizację. Ale powiedziałbym, że pierwszy jest zalecany, chociaż jest krótszy (patrz komentarz Paystey)Zgodnie z
foreach
dokumentacją PHP :źródło
foreach
naprawdę nie są zalecane, ponieważ sposób, w jakiforeach
przechodzi wokół wartościowej części pętli, powoduje nieprzewidywalne zachowanie. Może to trwać dłużej, ale jesteś o wiele bezpieczniejszy przy użyciu metody 1 tutaj.foreach
odniesieniu do horroru: stackoverflow.com/questions/3307409/ ... (@Nico, FYI też.)Z pewnością używając
array_map
i jeśli korzystasz z implementacji konteneraArrayAccess
do wyprowadzania obiektów jest po prostu mądrzejszym, semantycznym sposobem rozwiązania tego problemu?Semantyka mapy tablicowej jest podobna w większości języków i implementacji, które widziałem. Jest przeznaczony do zwracania zmodyfikowanej tablicy na podstawie elementu tablicy wejściowej (wysoki poziom ignorowania preferencji typu kompilacja / środowisko wykonawcze języka); pętla ma na celu wykonanie większej logiki.
Do pobierania obiektów według identyfikatora / PK, w zależności od tego, czy używasz SQL, czy nie (wydaje się to sugerowane), użyłbym filtra, aby upewnić się, że otrzymam tablicę prawidłowych PK, a następnie implodowałbym przecinkiem i umieścił w
IN()
klauzuli SQL , aby zwraca zestaw wyników. Wykonuje jedno wywołanie zamiast kilku za pośrednictwem SQL, optymalizując częśćcall->wait
cyklu. Co najważniejsze, mój kod dobrze czyta się komuś z dowolnego języka z pewnym stopniem kompetencji i nie mamy problemów ze zmiennością.vs
Jeśli wiesz, co robisz, nigdy nie będziesz mieć problemów ze zmiennością (pamiętaj, że jeśli zamierzasz nadpisać,
$arr
możesz zawsze$arr = array_map
i wyraźnie powiedzieć.źródło