Kadangkala dalam pembangunan PHP, kita perlu menukar rentetan kepada tatasusunan. Ini biasanya berlaku apabila kita menggunakan fungsi eval. Fungsi eval boleh melaksanakan rentetan sebagai kod PHP, supaya kita boleh menjana dan melaksanakan kod secara dinamik melalui rentetan. Dalam sesetengah kes, kami ingin melaksanakan tatasusunan yang dijana melalui fungsi eval. Pada ketika ini, kita perlu menukar rentetan kepada tatasusunan sebelum ia boleh digunakan dalam fungsi eval.
Dalam artikel ini, kita akan belajar cara menukar rentetan kepada tatasusunan menggunakan PHP untuk menggunakan fungsi eval dengan lebih baik.
1. Gunakan fungsi eval
Sebelum menulis contoh kod dalam artikel ini, kita perlu memahami fungsi eval terlebih dahulu. Fungsi
eval ialah fungsi yang sangat berkuasa dalam PHP yang boleh melaksanakan sebarang kod PHP yang sah. Biasanya, kita akan melihat fungsi eval yang digunakan untuk menjana kod PHP secara dinamik dan melaksanakannya. Sebagai contoh, kita boleh menggunakan fungsi eval untuk melaksanakan kod berikut:
$code = 'echo "Hello, World!";'; eval($code);
Kod ini akan mengeluarkan rentetan "Hello, World!".
Walaupun fungsi eval membolehkan kami melaksanakan sebarang kod PHP dengan sangat mudah, ia juga membawa beberapa risiko keselamatan. Oleh kerana fungsi eval boleh melaksanakan sebarang kod, pengguna berniat jahat boleh melaksanakan kod serangan dengan memasukkan sekeping kod berniat jahat. Oleh itu, anda perlu berhati-hati apabila menggunakan fungsi eval.
2. Tukar rentetan dalam fungsi eval kepada tatasusunan
Sekarang, kami menganggap bahawa kami menggunakan rentetan dalam fungsi eval untuk menjana tatasusunan, seperti kod berikut:
$code = 'array("apple", "banana", "orange")'; $result = eval($code);
Tujuan kod ini adalah untuk mencipta tatasusunan yang mengandungi tiga nama buah. Tatasusunan semasa telah ditulis dalam pembolehubah $code sebagai rentetan. Sebelum kita boleh menggunakan fungsi eval untuk melaksanakan rentetan ini, kita perlu menukarnya menjadi tatasusunan sebenar.
Nasib baik, PHP menyediakan fungsi yang dipanggil unserialize yang boleh menukar rentetan kepada tatasusunan. unserialize ialah fungsi penyahserialisasian dalam PHP, yang digunakan untuk menukar kembali data bersiri kepada pembolehubah PHP. Memandangkan kita akan menyimpan tatasusunan yang dicipta sebagai rentetan, fungsi unserialize berguna untuk kita. Kita boleh menukar rentetan kepada tatasusunan sebenar menggunakan kod berikut:
$code = 'array("apple", "banana", "orange")'; $array = unserialize(sprintf('a:%d:{%s}', count($arr = eval("return $code;")), implode(array_map(static fn($v) => "i:" . strlen($v) . ";s:$v", $arr))));
Akhir sekali, kita boleh menyusun semuanya untuk melengkapkan proses yang kita perlukan.
function codeToArray($code) { return unserialize(sprintf('a:%d:{%s}', count($arr = eval("return $code;")), implode(array_map(static fn($v) => "i:" . strlen($v) . ";s:$v", $arr)))); } $code = 'array("apple", "banana", "orange")'; $result = codeToArray($code); print_r($result); // 输出 ["apple", "banana", "orange"]
3. Penjelasan kod
Dalam fungsi ini, kami memperoleh tatasusunan $arr yang dikembalikan oleh kod melalui fungsi eval. Kami menggunakan tatasusunan ini untuk membina rentetan yang diperlukan yang menyimpan data bersiri dalam format tertentu.
Terdapat tiga pembolehubah di sini yang memerlukan penjelasan. Pembolehubah pertama ialah a, yang bermaksud ini ialah tatasusunan PHP. Pembolehubah kedua ialah %d, iaitu pemegang tempat dalam rentetan pemformatan berangka yang perlu digantikan dengan nilai integer. Di sini, ia digantikan dengan jumlah bilangan elemen tatasusunan. Pembolehubah terakhir ialah %s, yang juga pemegang tempat dalam rentetan pemformatan rentetan, menunjukkan bahawa ia perlu diganti dengan nilai rentetan. Di sini, ia digantikan dengan elemen tatasusunan bersiri.
Cara lain kita boleh menggunakan fungsi eval ialah kita boleh menggunakan operator kurungan untuk menjadikan fungsi eval mengembalikan hasil. Untuk menjadikan kod kami lebih mudah, kami boleh menggunakan operator kurungan supaya fungsi eval mengembalikan tatasusunan dan kemudian menghantar tatasusunan itu kepada fungsi bersiri.
function codeToArray($code) { return unserialize(sprintf('a:%d:{%s}', count($arr = eval("return ($code);")), implode(array_map(static fn($v) => "i:" . strlen($v) . ";s:$v", $arr)))); } $code = 'array("apple", "banana", "orange")'; $result = codeToArray($code); print_r($result); // 输出 ["apple", "banana", "orange"]
Di sini, kami menggunakan operator kurungan untuk membenarkan eval mengembalikan tatasusunan. Jadi, kita tidak perlu lagi membungkus tatasusunan dalam eval dan hanya menggunakan tatasusunan secara terus.
4. Ringkasan
Dalam artikel ini, kami meneroka cara menggunakan fungsi unserialize untuk menukar rentetan kepada tatasusunan. Ini adalah teknik yang sangat berguna apabila menggunakan fungsi eval. Jika anda perlu menggunakan fungsi eval dalam PHP untuk melaksanakan kod dan menggunakan tatasusunan dalam kod itu, maka artikel ini mungkin membantu anda.
Atas ialah kandungan terperinci Bagaimana untuk menukar rentetan eval php kepada tatasusunan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!