Rumah > pembangunan bahagian belakang > tutorial php > Menggunakan Iterator SPL, Bahagian 1

Menggunakan Iterator SPL, Bahagian 1

Joseph Gordon-Levitt
Lepaskan: 2025-02-27 10:14:10
asal
225 orang telah melayarinya

Using SPL Iterators, Part 1

mata teras

    Penyesuaian adalah proses umum untuk melintasi senarai nilai dalam pengaturcaraan. Dalam PHP, iterator adalah objek yang melintasi senarai, seperti array, senarai direktori, atau set hasil pangkalan data.
  • Perpustakaan PHP standard (SPL) menyediakan sejumlah besar iterator yang menjadikan kod itu lebih cekap dan boleh dibaca. Menggunakan pemalsuan SPL sangat berfaedah apabila berurusan dengan sejumlah besar data atau struktur kompleks di luar tatasusunan mudah.
  • ArrayIterator dan RecursiveArrayIterator adalah dua iterator SPL yang digunakan untuk melangkah ke atas tatasusunan. ArrayIterator digunakan untuk tatasusunan satu dimensi, dan recursiveArrayIterator digunakan untuk susunan multidimensi.
  • DirectoryIterator dan RecursiveDirectoryIterator adalah Iterator SPL yang digunakan untuk melintasi senarai direktori. DirectoryIterator boleh digunakan untuk melangkah ke atas direktori, manakala RecursiveDirectoryIterator digunakan untuk melintasi direktori secara rekursif.
Saya merasakan sedikit terkejut apabila saya mula -mula bersentuhan dengan istilah "lelaran" dan melihat banyak kategori yang berkaitan dengannya di SPL. Lelaran nampaknya terlalu rumit untuk difahami. Tetapi saya tidak lama lagi menyedari bahawa ia hanyalah pernyataan operasi yang cantik yang kami lakukan. Jika anda menggunakan PHP, anda mungkin menggunakan tatasusunan. Jika anda telah menggunakan array, anda sudah pasti berulang melalui unsur -unsurnya. Melihat mana -mana kod, anda hampir pasti dapat mencari gelung

. Ya, lelaran hanyalah proses melintasi senarai nilai. Iterator adalah objek yang melintasi senarai, yang boleh menjadi array, senarai direktori, atau set hasil pangkalan data. Di bahagian pertama siri ini, saya akan memperkenalkan anda kepada lelaran dan bagaimana untuk memanfaatkan beberapa kelas terbina dalam dalam Perpustakaan PHP Standard (SPL). SPL mengandungi sebilangan besar iterator, menggunakannya dalam kod anda boleh meningkatkan kecekapan kod dan, dalam kebanyakan kes, membuat kod lebih mudah dibaca. foreach

kapan dan mengapa menggunakan iterator spl

Seperti yang anda lihat, objek iterator iterative pada dasarnya sama dengan array berulang, begitu banyak orang ingin tahu sama ada lebih mudah untuk melekat dengan array pada mulanya. Walau bagaimanapun, kelebihan sebenar iterator adalah ketika melintasi sejumlah besar data atau data yang lebih kompleks daripada array mudah. Gelung

salinan mana -mana array yang diserahkan kepadanya. Jika anda bekerja pada sejumlah besar data, anda akan menyalinnya setiap kali anda menggunakan array yang besar dalam gelung, yang mungkin tidak diingini. Iterator SPL merangkumi senarai dan mendedahkan penglihatan hanya satu elemen pada satu masa, menjadikannya lebih efisien. Iterator adalah pembinaan yang baik apabila membuat penyedia data, kerana ia membolehkan anda melambatkan pemuatan data. Memuatkan malas di sini hanya mengambil data yang diperlukan apabila diperlukan. Anda juga boleh memanipulasi (penapis, menukar, dan lain -lain) data yang diproses sebelum menjadikannya tersedia kepada pengguna. Walau bagaimanapun, keputusan untuk menggunakan iterator sentiasa mengikut budi bicara anda. Terdapat banyak manfaat untuk iterators, tetapi dalam beberapa kes (seperti set array yang lebih kecil), ia boleh membawa kepada overhead yang tidak perlu. Bila menggunakannya terpulang kepada anda; foreach foreach

Arahan lelaran

Iterator pertama yang ingin saya perkenalkan kepada anda adalah ArrayIterator. Pembina mengambil array sebagai hujah dan menyediakan kaedah yang boleh digunakan untuk melintasinya. Berikut adalah contoh:

<?php
// 一个数组(使用PHP 5.4的新简写法)
$arr = ["sitepoint", "phpmaster", "buildmobile", "rubysource",
    "designfestival", "cloudspring"];

// 创建一个新的ArrayIterator并传入数组
$iter = new ArrayIterator($arr);

// 遍历对象
foreach ($iter as $key => $value) {
    echo $key . ":  " . $value . "<br></br>";
}
Salin selepas log masuk
Salin selepas log masuk

output kod di atas adalah:

<code>0: sitepoint
1: phpmaster
2: buildmobile
3: rubysource
4: designfestival
5: cloudspring</code>
Salin selepas log masuk
Salin selepas log masuk

Biasanya, anda akan menggunakan ArrayObject (kelas yang membolehkan anda memproses objek sebagai tatasusunan dalam konteks tertentu) dan bukannya menggunakan ArrayIterator secara langsung. Apabila anda menggunakan gelung foreach atau panggilan ArrayIterator :: getIterator () secara langsung, ia secara automatik akan membuat arrayIterator untuk anda. Perhatikan bahawa sementara ArrayObject dan ArrayIterator berkelakuan seperti array dalam konteks ini, mereka masih objek; ArrayIterator mudah digunakan, tetapi hanya untuk tatasusunan satu dimensi. Kadang -kadang anda mempunyai pelbagai multidimensi dan anda ingin berulang -ulang meleleh melalui array bersarang. Dalam kes ini, anda boleh menggunakan RecursiveArrayIterator. Senario yang biasa adalah untuk bersarang sort() gelung atau membuat fungsi rekursif untuk memeriksa semua item dalam pelbagai multidimensi. Contohnya: array_keys() foreach output kod di atas adalah:

<?php
// 一个多维数组
$arr = [
    ["sitepoint", "phpmaster"],
    ["buildmobile", "rubysource"],
    ["designfestival", "cloudspring"],
    "not an array"
];

// 遍历对象
foreach ($arr as $key => $value) {
    // 检查数组
    if (is_array($value)) {
        foreach ($value as $k => $v) {
            echo $k . ": " . $v . "<br></br>";
        }
    } else {
        echo $key . ": " . $value . "<br></br>";
    }
}
Salin selepas log masuk
Salin selepas log masuk

Cara yang lebih elegan adalah menggunakan RecursiveArrayIterator:

<code>0: sitepoint
1: phpmaster
0: buildmobile
1: rubysource
0: designfestival
1: cloudspring
3: not an array</code>
Salin selepas log masuk
Salin selepas log masuk

output adalah sama seperti dalam contoh sebelumnya. Perhatikan bahawa anda perlu membuat contoh recursiveIterator di sini dan lulus ke objek RecursiveArrayIterator, jika tidak, anda hanya akan mendapat nilai dalam array akar (dan banyak pemberitahuan yang dihasilkan berdasarkan tetapan anda). Apabila bekerja dengan tatasusunan pelbagai dimensi, anda harus menggunakan RecursiveArrayIterator kerana ia membolehkan anda meleleh melalui entri semasa, tetapi ia bergantung kepada anda melakukannya sendiri. RecursiveIteratorerator adalah penghias yang melakukan ini untuk anda. Ia mengambil recursiveArrayIterator, melangkah ke atasnya dan melangkah ke atas mana -mana penyertaan yang boleh didapati (dan sebagainya). Pada asasnya, ia "flat" recursiveArrayIterator. Anda boleh mendapatkan kedalaman lelaran semasa untuk menjejaki dengan memanggil recursiveIteratorerator :: getDepth (). Walau bagaimanapun, jika anda ingin mengembalikan objek, berhati -hati untuk menggunakan RecursiveArrayIterator dan RecursiveIteratorerator;

<?php
...
$iter = new RecursiveArrayIterator($arr);

// 遍历对象
// 我们需要创建一个RecursiveIteratorIterator实例
foreach (new RecursiveIteratorIterator($iter) as $key => $value) {
    echo $key . ": " . $value . "<br></br>";
}
Salin selepas log masuk
Salin selepas log masuk

Senarai direktori iTeration

Anda pasti perlu melangkah ke atas direktori dan failnya pada satu ketika dan anda boleh melakukan ini menggunakan fungsi terbina dalam yang disediakan oleh PHP (seperti atau

), tetapi anda juga boleh menggunakan direktorierator. Dalam bentuk yang paling mudah, DirectoryIterator sangat kuat, tetapi ia juga boleh disublassa dan dipertingkatkan. Berikut adalah contoh melelehkan direktori menggunakan direktorierator:

scandir() glob() output jelas bergantung pada jalan yang anda nyatakan dan kandungan direktori. Contohnya:

<?php
// 创建新的DirectoryIterator对象
$dir = new DirectoryIterator("/my/directory/path");

// 遍历目录列表
foreach ($dir as $item) {
    echo $item . "<br></br>";
}
Salin selepas log masuk
Jangan lupa bahawa untuk DirectoryIterator dan banyak Iterator SPL lain yang anda boleh menggunakan pengecualian untuk mengendalikan sebarang kesilapan.

<?php
// 一个数组(使用PHP 5.4的新简写法)
$arr = ["sitepoint", "phpmaster", "buildmobile", "rubysource",
    "designfestival", "cloudspring"];

// 创建一个新的ArrayIterator并传入数组
$iter = new ArrayIterator($arr);

// 遍历对象
foreach ($iter as $key => $value) {
    echo $key . ":  " . $value . "<br></br>";
}
Salin selepas log masuk
Salin selepas log masuk
<code>0: sitepoint
1: phpmaster
2: buildmobile
3: rubysource
4: designfestival
5: cloudspring</code>
Salin selepas log masuk
Salin selepas log masuk

Gunakan banyak kaedah lain seperti DirectoryIterator :: iSdot (), DirectoryIterator :: GetType (), dan DirectoryIterator :: GetSize (), hampir semua keperluan maklumat direktori asas anda. Anda juga boleh menggabungkan direktori dengan penapis atau regexiterator untuk mengembalikan fail yang sepadan dengan keadaan tertentu. Contohnya:

<?php
// 一个多维数组
$arr = [
    ["sitepoint", "phpmaster"],
    ["buildmobile", "rubysource"],
    ["designfestival", "cloudspring"],
    "not an array"
];

// 遍历对象
foreach ($arr as $key => $value) {
    // 检查数组
    if (is_array($value)) {
        foreach ($value as $k => $v) {
            echo $k . ": " . $v . "<br></br>";
        }
    } else {
        echo $key . ": " . $value . "<br></br>";
    }
}
Salin selepas log masuk
Salin selepas log masuk
SPL juga menyediakan recursiveDirectoryIterator, yang digunakan dengan cara yang sama seperti RecursiveArrayIterator. Fungsi yang secara rekursive melintasi direktori sering mengandungi banyak cek bersyarat untuk memeriksa direktori dan fail yang sah, sementara RecursiveDirectoryIterator boleh melakukan sebahagian besar kerja untuk anda, menghasilkan kod bersih. Walau bagaimanapun, terdapat amaran. RecursivedirectoryIterator tidak mengembalikan direktori kosong;

<code>0: sitepoint
1: phpmaster
0: buildmobile
1: rubysource
0: designfestival
1: cloudspring
3: not an array</code>
Salin selepas log masuk
Salin selepas log masuk
output saya serupa dengan:

<?php
...
$iter = new RecursiveArrayIterator($arr);

// 遍历对象
// 我们需要创建一个RecursiveIteratorIterator实例
foreach (new RecursiveIteratorIterator($iter) as $key => $value) {
    echo $key . ": " . $value . "<br></br>";
}
Salin selepas log masuk
Salin selepas log masuk

Ringkasan

Harap anda sekarang menyedari bahawa lelaran tidak begitu rumit seperti yang saya fikirkan pada mulanya, ia adalah sesuatu yang kita lakukan setiap hari. Dalam artikel ini, saya telah memperkenalkan lelaran dan beberapa kelas yang disediakan oleh SPL untuk menjadikan lelaran lebih mudah dan lebih mantap. Sudah tentu, saya hanya berurusan dengan sebahagian kecil daripada sampel kelas yang ada; SPL adalah perpustakaan "standard". Kadang -kadang anda mungkin mendapati kelas ini terlalu umum dan mereka mungkin tidak selalu memenuhi keperluan anda. Dalam kes ini, anda boleh dengan mudah melanjutkan kelas ini untuk menambah fungsi anda sendiri atau untuk menyesuaikan fungsi sedia ada seperti yang diperlukan. Di bahagian seterusnya siri ini, saya akan menunjukkan kepada anda cara menggunakan antara muka SPL untuk membuat kelas tersuai anda sendiri yang boleh dilalui dan diakses seperti array.

gambar dari Mushakesa / Shutterstock

Soalan Lazim Mengenai Menggunakan Iterator SPL

Apa yang dimaksudkan dalam PHP dan mengapa ia penting?

SPL bermaksud perpustakaan php standard. Ia adalah satu set antara muka dan kelas yang direka untuk menyelesaikan masalah biasa. SPL menyediakan banyak struktur data, antara muka, dan pengecualian yang boleh digunakan untuk mengendalikan tugas kompleks dengan lebih cekap. Ia penting kerana ia dapat membantu mengurangkan jumlah kod yang anda perlukan untuk menulis, meningkatkan prestasi, dan menjadikan kod anda lebih mudah untuk dibaca dan diselenggara.

Bagaimana menggunakan Iterator SPL dalam PHP?

Iterator SPL digunakan untuk melangkah ke atas set data. Untuk menggunakan Iterator SPL, anda perlu membuat contoh kelas Iterator. Anda kemudian boleh melangkah melalui koleksi menggunakan kaedah iterator. Sebagai contoh, anda boleh menggunakan kaedah

untuk mendapatkan item semasa, gunakan kaedah

untuk bergerak ke item seterusnya, dan gunakan kaedah current() untuk memeriksa sama ada terdapat lebih banyak item untuk melangkah ke atas. next() valid() Apakah beberapa contoh pengiklan SPL?

Terdapat banyak jenis pengiklan SPL, masing -masing direka untuk tujuan tertentu. Beberapa contoh termasuk ArrayIterator (untuk melelehkan tatasusunan);

Bagaimana untuk menapis data menggunakan Iterator SPL?

anda boleh menapis data dengan menggunakan kelas penapis. Kelas ini membolehkan anda menentukan penapis tersuai yang digunakan untuk setiap item dalam koleksi. Hanya item yang melalui penapis akan dikembalikan oleh Iterator.

Bagaimana untuk menyusun data menggunakan Iterator SPL?

Anda boleh menyusun data dengan menggunakan kelas ArrayObject. Kelas ini menyediakan kaedah asort() untuk menyusun item dalam koleksi. Anda juga boleh menggunakan kaedah uasort() untuk menyusun item menggunakan fungsi perbandingan tersuai.

Apakah pengecualian SPL dan bagaimana anda menggunakannya?

Pengecualian SPL adalah jenis pengecualian yang direka khas untuk SPL. Mereka menyediakan cara untuk menangani kesilapan yang berlaku semasa menggunakan SPL. Untuk menggunakan pengecualian SPL, anda hanya membuangnya ke dalam blok try dan menangkapnya di blok catch.

Bagaimana cara membaca dan menulis fail menggunakan SPL?

Anda boleh menggunakan kelas SplfileObject untuk membaca dan menulis fail. Kelas ini menyediakan kaedah untuk membuka, membaca, menulis, dan menutup fail. Ia juga menyediakan kaedah untuk memindahkan petunjuk fail dan memeriksa sama ada akhir fail telah dicapai.

Bagaimana menggunakan SPL untuk memproses direktori?

Anda boleh menggunakan kelas direktori untuk memproses direktori. Kelas ini menyediakan kaedah untuk membuka direktori, membaca kandungannya, dan menutup direktori. Ia juga menyediakan kaedah untuk memeriksa sama ada fail adalah direktori dan untuk mendapatkan saiz, jenis, dan masa pengubahsuaian fail.

Bagaimana menggunakan SPL untuk memproses tatasusunan?

Anda boleh menggunakan kelas ArrayObject dan ArrayIterator untuk memproses tatasusunan. Kelas -kelas ini menyediakan kaedah untuk membuat array, menambah item kepadanya, mengeluarkan item daripadanya, dan melangkah ke atas itemnya. Mereka juga menyediakan kaedah untuk menyusun tatasusunan dan memeriksa jika item wujud dalam array.

Bagaimana menggunakan SPL untuk memproses struktur data?

Anda boleh menggunakan pelbagai kelas struktur data yang disediakan oleh SPL untuk memproses struktur data. Kelas -kelas ini termasuk splstack, splqueue, splheap, dan splpriorityqueue. Setiap kelas menyediakan kaedah untuk mewujudkan struktur data, menambah item kepadanya, mengeluarkan item daripadanya, dan melangkah ke atas itemnya.

Atas ialah kandungan terperinci Menggunakan Iterator SPL, Bahagian 1. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan