Saya mempunyai soalan mudah, tetapi tidak kira apa, saya tidak dapat mengetahui apa yang sedang berlaku. Saya mempunyai rentetan JSON yang kelihatan seperti ini:
{ "network_title": "Rangkaian", "class_title": "Kelas", "gred": [{ "number": "Pra-K", "label": "Pra-Tadika", "pesanan": 1, "id": "34567" }, { "nombor": "TK", "label": "Tadika Peralihan", "pesanan": 2, "id": "23456" }, { "nombor": "K", "label": "Tadika", "pesanan": 3, "id": "12345" }] }
Ia ditukar kepada tatasusunan seperti ini (atas sebab tertentu):
array:3 [ "network_title" => "class_title" => "Kelas" "gred" => tatasusunan:3 [ 0 => tatasusunan:4 [ "nombor" => "Pra-K" "label" => "Pra-Tadika" "pesanan" => "gid" => "aa71da69-93ab-11e9-bda9-06f442b19d06" ] 1 => tatasusunan:4 [ "nombor" => "TK" "label" => "Tadika Peralihan" "pesanan" => "gid" => "d3c6754a-6298-48d0-9afa-6a19bafb8464" ] 2 => tatasusunan:4 [ "nombor" => "K" "label" => "Tadika" "pesanan" => "gid" => "a815a771-9aff-4020-b7d2-0c95a05da21e" ] ] ]
Kemudian saya cuba mengulangi tatasusunan, dan apabila ia menjumpai elemen yang jenisnya bukan rentetan (seperti elemen tertib), ia mendapat argumen Tidak sah yang dibekalkan untuk ralat foreach(). Mesej ralat mengatakan bahawa baris foreach() bermasalah. Berikut ialah contoh kod:
foreach ($arrTree as $k => $v) { jika (is_string($v)) { //Buat sesuatu di sini } }
Saya pasti saya kehilangan sesuatu yang asas di sini, tetapi saya bosan mencari masalah. Terima kasih.
Masalahnya ialah $arrTree ialah tatasusunan berbilang dimensi.
Gelung foreach dalam kod anda hanya merentasi tahap pertama tatasusunan, bukan tatasusunan bersarang (seperti "gred"). Apabila ia menemui "gred" nilai $v bukan rentetan tetapi tatasusunan, itulah sebabnya semakan is_string($v) gagal.
Anda perlu menambah gelung foreach bersarang untuk mengendalikan struktur ini.
Berikut ialah contoh yang menunjukkan cara untuk mencapai ini:
foreach ($arrTree as $k => $v) { if (is_string($v)) { //Do something here } else if (is_array($v)) { foreach($v as $key => $value) { if(is_string($value)) { //Do something here } else if(is_array($value)) { foreach($value as $innerKey => $innerValue) { if(is_string($innerValue)) { //Do something here } } } } } }