Dalam PHP, kami boleh menggunakan kelas untuk menentukan beberapa jenis data yang kompleks untuk mencapai modularisasi dan penggunaan semula kod yang lebih fleksibel, dan tatasusunan dua dimensi ialah salah satu jenis data yang biasa digunakan dalam PHP. Boleh digunakan untuk menyimpan data berstruktur yang kompleks. Tetapi kadangkala apabila menggunakan kelas dan tatasusunan dua dimensi, anda mungkin menghadapi ralat yang disebabkan oleh pembolehubah yang terkandung dalam nilai. Berikut akan membincangkan cara menyelesaikan masalah ini melalui analisis kes dan penyelesaian.
Latar Belakang Kes
Dalam projek PHP tertentu, beberapa maklumat pelajar perlu disimpan dalam tatasusunan dua dimensi dan dikumpulkan mengikut gred dan kelas. Pertama, kelas bernama Pelajar ditakrifkan, kodnya adalah seperti berikut:
class Student { public $name; public $age; public $grade; public $class; }
Kemudian tatasusunan dua dimensi bernama $students ditakrifkan untuk menyimpan berbilang contoh Pelajar, kodnya adalah seperti berikut:
$students = [ ['name' => '张三', 'age' => 18, 'grade' => 1, 'class' => 1], ['name' => '李四', 'age' => 19, 'grade' => 1, 'class' => 2], ['name' => '王五', 'age' => 18, 'grade' => 2, 'class' => 1], ['name' => '赵六', 'age' => 19, 'grade' => 2, 'class' => 2] ];
Seterusnya, maklumat pelajar ini perlu dikumpulkan mengikut gred dan kelas, dan kemudian mengira bilangan orang dalam setiap kumpulan. Kodnya adalah seperti berikut:
$count = []; foreach ($students as $student) { $count[$student['grade']][$student['class']]++; }
Tetapi apabila anda menjalankan kod di atas, anda akan menemui mesej ralat:
PHP Warning: Undefined offset: 1
Analisis Masalah
Dalam kod di atas, $ pembolehubah kira ialah tatasusunan dua dimensi $pelajar['gred'] dan $pelajar['kelas'] digunakan untuk mendapatkan maklumat gred dan kelas setiap pelajar ini digunakan sebagai subskrip sekunder bagi $count tatasusunan untuk melaksanakan statistik kumpulan maklumat pelajar. Walau bagaimanapun, dalam tatasusunan $count, subskrip peringkat kedua yang sepadan mula dikira dari 0, manakala maklumat gred dan kelas dalam $student['grade'] dan $student['class'] kedua-duanya mula mengira dari 1. , oleh itu, sisihan berlaku apabila mengakses tatasusunan dua dimensi.
Selain itu, nilai dalam tatasusunan $count pada mulanya adalah batal, dan jenis nilai adalah integer, oleh itu, apabila menambah 1 padanya, penukaran jenis nilai akan berlaku dan ralat akan berlaku. Ini juga salah satu punca kesilapan.
Penyelesaian
Untuk menyelesaikan masalah di atas, kod perlu dilaraskan dengan sewajarnya. Khususnya, nilai $student['gred'] dan $student['class'] masing-masing boleh dikurangkan sebanyak 1 untuk menyesuaikan diri dengan keperluan subskrip tatasusunan $count. Pada masa yang sama, tatasusunan $count perlu dimulakan untuk mengelakkan ralat penukaran jenis.
Kod refactored adalah seperti berikut:
$count = []; foreach ($students as $student) { $grade = $student['grade'] - 1; $class = $student['class'] - 1; if (!isset($count[$grade][$class])) { $count[$grade][$class] = 0; } $count[$grade][$class]++; }
Dalam kod baharu ini, kami mula-mula menurunkan nilai $student['gred'] dan $student['class'] oleh 1 masing-masing , dan kemudian tentukan sama ada subskrip sekunder yang sepadan wujud dalam tatasusunan $count Jika ia tidak wujud, ia dimulakan kepada 0. Selepas itu, apabila menambah 1 pada tatasusunan $count, tidak akan ada ralat penukaran jenis dan masalah subskrip di luar sempadan.
Kesimpulan
Dalam PHP, kelas dan tatasusunan biasanya digunakan jenis data, tetapi kerumitan dan fleksibilitinya kadangkala membawa kepada beberapa masalah. Bermula daripada contoh, artikel ini menganalisis secara terperinci sebab pembolehubah dalam nilai dalam kelas dan tatasusunan melaporkan ralat, serta cara melaraskan dan menambah baik penyelesaian. Saya harap kandungan ini boleh memberi inspirasi dan membantu pembangun PHP.
Atas ialah kandungan terperinci Mengapa pembolehubah dalam nilai tatasusunan dua dimensi kelas php melaporkan ralat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!