Saya sangat baru di array multi dimensi, dan ini mengganggu saya waktu besar.
Array saya adalah sebagai berikut:
$fields = array(
"names" => array(
"type" => "text",
"class" => "name",
"name" => "name",
"text_before" => "name",
"value" => "",
"required" => true,
)
)
Lalu saya mendapat fungsi memeriksa apakah input ini diisi, jika mereka diperlukan.
function checkForm($fields){
foreach($fields as $field){
if($field['required'] && strlen($_POST[$field['name']]) <= 0){
$fields[$field]['value'] = "Some error";
}
}
return $fields;
}
Sekarang masalah saya adalah baris ini
$fields[$field]['value'] = "Some error";
Saya ingin mengubah konten array asli, karena saya mengembalikan ini, tetapi bagaimana cara mendapatkan nama array saat ini (nama dalam contoh ini) di loop foreach saya?
Jawaban:
Dalam PHP, melewatkan dengan referensi (
&
) adalah ... kontroversial. Saya sarankan tidak menggunakannya kecuali Anda tahu mengapa Anda membutuhkannya dan menguji hasilnya.Saya akan merekomendasikan melakukan hal berikut:
Jadi pada dasarnya gunakan
$field
ketika Anda membutuhkan nilai-nilai, dan$fields[$key]
ketika Anda perlu mengubah data.sumber
foreach
harus kontroversial? Ini tidak seperti panggilan fungsi dengan efek samping tersembunyi atau apa pun.Gunakan
&
:&
melewati nilai array sebagai referensi dan tidak membuat instance variabel baru. Jadi, jika Anda mengubah referensi, nilai aslinya akan berubah.http://php.net/manual/en/language.references.pass.php
Sunting 2018
Jawaban ini tampaknya disukai oleh banyak orang di internet, itulah sebabnya saya memutuskan untuk menambahkan lebih banyak informasi dan kata-kata kehati-hatian.
Walaupun pass by reference dalam
foreach
(atau fungsi) adalah solusi yang bersih dan singkat, bagi banyak pemula ini mungkin merupakan perangkap yang berbahaya.Ini bisa menjadi masalah serius ketika variabel sedang digunakan kembali dalam cakupan yang sama. Pertanyaan SO lainnya menggambarkan dengan baik mengapa itu bisa menjadi masalah.
Membatalkan pengaturan catatan atau mengubah nilai hash (kunci) selama iterasi pada loop yang sama dapat menyebabkan perilaku yang berpotensi tidak terduga di PHP <7. Masalahnya menjadi semakin rumit ketika array itu sendiri adalah referensi.
Performa pemain depan.
Secara umum PHP lebih suka nilai berdasarkan karena fitur copy-on-write. Ini berarti bahwa secara internal PHP tidak akan membuat data duplikat kecuali salinannya perlu diubah. Masih bisa diperdebatkan apakah pass by reference in
foreach
akan menawarkan peningkatan kinerja. Karena selalu demikian, Anda perlu menguji skenario spesifik Anda dan menentukan opsi mana yang menggunakan lebih sedikit memori dan waktu cpu. Untuk informasi lebih lanjut lihat posting SO yang ditautkan di bawah ini oleh NikiC.Keterbacaan kode.
Membuat referensi dalam PHP adalah sesuatu yang cepat hilang kendali. Jika Anda seorang pemula dan tidak memiliki kendali penuh atas apa yang Anda lakukan, yang terbaik adalah menjauh dari referensi. Untuk informasi lebih lanjut tentang
&
operator, lihat panduan ini: Referensi - Apa arti simbol ini dalam PHP?Bagi mereka yang ingin mempelajari lebih lanjut tentang bagian bahasa PHP ini : Penjelasan Referensi PHP
Penjelasan teknis yang sangat bagus dari @NikiC tentang logika internal dari PHP foreach loop:
Bagaimana cara kerja PHP 'foreach'?
sumber
unset($value);
setelahforeach
braket penutupan, untuk memastikan variabel referensi-by tidak lagi tersedia setelah iterasi. 3v4l.org/2V2AQGunakan
foreach($fields as &$field){
- jadi Anda akan bekerja dengan array asli.Berikut ini lebih lanjut tentang melewati referensi.
sumber
Inilah yang akan saya sarankan lewat referensi
sumber
$fields
?Coba ini
sumber