Saya bertanya-tanya apakah mungkin untuk mengedit objek saat ini yang ditangani dalam satu foreach
lingkaran
Saya bekerja dengan berbagai objek $questions
dan saya ingin menelusuri dan mencari jawaban yang terkait dengan objek pertanyaan di db saya. Jadi untuk setiap pertanyaan, ambil objek jawaban dan perbarui arus $question
di dalam foreach
loop saya sehingga saya dapat mengeluarkan / memproses di tempat lain.
foreach($questions as $question){
$question['answers'] = $answers_model->get_answers_by_question_id($question['question_id']);
}
Jawaban:
Ada 2 cara untuk melakukan ini
Dengan cara ini Anda menyimpan kunci, sehingga Anda dapat memperbaruinya lagi di
$questions
variabel utamaatau
Menambahkan
&
akan membuat$questions
pembaruan tetap . Tetapi saya akan mengatakan yang pertama direkomendasikan meskipun ini lebih pendek (lihat komentar oleh Paystey)Sesuai dokumentasi PHP
foreach
:sumber
foreach
benar-benar tidak disarankan, caraforeach
operan di sekitar bagian nilai dari loop menghasilkan perilaku yang tidak dapat diprediksi. Mungkin lebih lama tetapi Anda jauh lebih aman menggunakan metode 1 di sini.foreach
tentang horor seperti ini: stackoverflow.com/questions/3307409/… (@Nico, FYI, juga.)Tentunya menggunakan
array_map
dan jika menggunakan wadah yang mengimplementasikanArrayAccess
untuk mendapatkan objek hanyalah cara semantik yang lebih cerdas untuk melakukan hal ini?Semantik peta larik serupa di sebagian besar bahasa dan implementasi yang pernah saya lihat. Ini dirancang untuk mengembalikan array yang dimodifikasi berdasarkan elemen array input (tingkat tinggi mengabaikan kompilasi bahasa / preferensi jenis runtime); loop dimaksudkan untuk melakukan lebih banyak logika.
Untuk mengambil objek dengan ID / PK, tergantung pada apakah Anda menggunakan SQL atau tidak (sepertinya disarankan), saya akan menggunakan filter untuk memastikan saya mendapatkan array PK yang valid, kemudian meledak dengan koma dan tempatkan ke
IN()
klausa SQL ke kembalikan set hasil. Itu membuat satu panggilan alih-alih beberapa melalui SQL, mengoptimalkan sedikitcall->wait
siklus. Yang terpenting, kode saya akan terbaca dengan baik bagi seseorang dari bahasa apa pun dengan tingkat kompetensi tertentu dan kami tidak mengalami masalah mutabilitas.vs.
Jika Anda tahu apa yang Anda lakukan tidak akan pernah memiliki masalah mutabilitas (mengingat jika Anda berniat menimpa
$arr
Anda selalu bisa$arr = array_map
dan eksplisit.sumber