Apakah ada cara yang bagus untuk mengulang karakter string? Saya ingin bisa melakukan foreach
, array_map
, array_walk
, array_filter
dsb di karakter dari string.
Ketik casting / juggling tidak membawa saya ke mana pun (letakkan seluruh string sebagai satu elemen array), dan solusi terbaik yang saya temukan hanyalah menggunakan for loop untuk membangun array. Rasanya harus ada sesuatu yang lebih baik. Maksud saya, jika Anda dapat mengindeksnya, bukankah seharusnya Anda dapat mengulangnya juga?
Ini yang terbaik yang aku punya
function stringToArray($s)
{
$r = array();
for($i=0; $i<strlen($s); $i++)
$r[$i] = $s[$i];
return $r;
}
$s1 = "textasstringwoohoo";
$arr = stringToArray($s1); //$arr now has character array
$ascval = array_map('ord', $arr); //so i can do stuff like this
$foreach ($arr as $curChar) {....}
$evenAsciiOnly = array_filter( function($x) {return ord($x) % 2 === 0;}, $arr);
Apakah ada:
A) Sebuah cara untuk membuat string iterable
B) Cara yang lebih baik untuk membangun array karakter dari string (dan jika demikian, bagaimana dengan arah lainnya?)
Saya merasa seperti saya kehilangan sesuatu yang jelas di sini.
sumber
array_filter
dalam pengertian ini bisa lebih baik dilakukan dengan fungsi string atau reg-exJawaban:
Langkah 1: Ubah string menjadi array menggunakan
str_split
fungsi$array = str_split($your_string);
Langkah 2: lakukan loop melalui array yang baru dibuat
Anda dapat memeriksa dokumen PHP untuk informasi lebih lanjut:
str_split
sumber
str_split() will split into bytes, rather than characters when dealing with a multi-byte encoded string.
- Jadistr_split
tidak bisa bekerja dengan UnicodeIterasi string:
sumber
strlen()
setiap iterasi. Bukan hal yang buruk, karena PHP memiliki panjang yang telah dihitung sebelumnya, tetapi masih merupakan pemanggilan fungsi. Jika Anda membutuhkan kecepatan, lebih baik simpan itu dalam variabel sebelum memulai loop.Jika string Anda dalam Unicode, Anda harus menggunakan
preg_split
dengan/u
pengubahDari komentar di dokumentasi php:
sumber
mb_split
lebih andal.Anda juga dapat mengakses $ s1 seperti array, jika Anda hanya perlu mengaksesnya:
sumber
Diperluas dari jawaban @SeaBrightSystems, Anda dapat mencoba ini:
sumber
Bagi mereka yang mencari cara tercepat untuk melakukan iterasi string di php, saya sudah menyiapkan pengujian benchmark.
Metode pertama di mana Anda mengakses karakter string secara langsung dengan menentukan posisinya dalam tanda kurung dan memperlakukan string seperti array:
Saya sendiri mengira yang terakhir adalah metode tercepat, tetapi saya salah.
Adapun metode kedua (yang digunakan dalam jawaban yang diterima):
Metode ini akan menjadi lebih cepat karena kita menggunakan array yang sebenarnya dan tidak menganggapnya sebagai array.
Memanggil baris terakhir dari masing-masing metode di atas untuk
1000000
waktu mengarah pada hasil pembandingan berikut:Menggunakan string [i]
0.24960017204285 Seconds
Menggunakan str_split
0.18720006942749 Seconds
Artinya cara kedua jauh lebih cepat.
sumber
Hmm ... Tidak perlu mempersulit. Dasar-dasar selalu bekerja dengan baik.
Arah Maju:
Keluaran:
abcdef
Arah Terbalik:
Keluaran:
fedcba
sumber
sumber
Sebagian besar jawaban lupa tentang karakter non Inggris !!!
strlen
menghitung BYTES, bukan karakter, itulah mengapa demikian dan fungsi saudara kandungnya berfungsi dengan baik dengan karakter bahasa Inggris, karena karakter bahasa Inggris disimpan dalam 1 byte dalam encoding UTF-8 dan ASCII, Anda perlu menggunakan fungsi string multibytemb_*
Ini akan bekerja dengan karakter apa pun yang dikodekan
UTF-8
Output ini
sumber