Czy istnieje dobry sposób na iterację znaków w ciągu? Chciałbym być w stanie to zrobić foreach
, array_map
, array_walk
, array_filter
itd. W postaci napisu.
Typ casting / juggling nigdzie mnie nie zaprowadził (umieść cały łańcuch jako jeden element tablicy), a najlepszym rozwiązaniem, jakie znalazłem, jest użycie pętli for do skonstruowania tablicy. Wydaje się, że powinno być coś lepszego. Chodzi mi o to, że jeśli możesz na nim indeksować, czy nie powinieneś również być w stanie iterować?
To najlepsze, jakie mam
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);
Czy istnieje:
A) Sposób na iterowalność ciągu
B) Lepszy sposób na zbudowanie tablicy znaków z łańcucha (a jeśli tak, to co powiesz na drugą stronę?)
Czuję, że brakuje mi czegoś oczywistego.
php
string
character-arrays
jon_darkstar
źródło
źródło
array_filter
w tym sensie, można lepiej zrobić za pomocą funkcji string lub reg-exOdpowiedzi:
Krok 1: przekonwertuj ciąg na tablicę za pomocą
str_split
funkcji$array = str_split($your_string);
Krok 2: pętla przez nowo utworzoną tablicę
Możesz sprawdzić dokumentację PHP, aby uzyskać więcej informacji:
str_split
źródło
str_split() will split into bytes, rather than characters when dealing with a multi-byte encoded string.
- Więcstr_split
nie może działać z UnicodeIteruj ciąg:
źródło
strlen()
do każdej iteracji. Nie jest to straszna rzecz, ponieważ PHP ma wstępnie obliczoną długość, ale nadal jest wywołaniem funkcji. Jeśli potrzebujesz szybkości, lepiej zapisz ją w zmiennej przed uruchomieniem pętli.Jeśli twoje łańcuchy są w Unicode, powinieneś użyć
preg_split
z/u
modyfikatoremZ komentarzy w dokumentacji php:
źródło
mb_split
jest bardziej niezawodny.Możesz także uzyskać dostęp do $ s1 jak do tablicy, jeśli potrzebujesz tylko dostępu do niej:
źródło
Po rozwinięciu z odpowiedzi @SeaBrightSystems możesz spróbować tego:
źródło
Dla tych, którzy szukają najszybszego sposobu na iterację po napisach w php, przygotowałem test porównawczy.
Pierwsza metoda, w której uzyskuje się dostęp do znaków ciągu bezpośrednio, określając jego pozycję w nawiasach i traktując ciąg jako tablicę:
Sam uważałem, że ta druga metoda jest najszybszą metodą, ale się myliłem.
Podobnie jak w przypadku drugiej metody (która jest używana w przyjętej odpowiedzi):
Ta metoda będzie szybsza, ponieważ używamy prawdziwej tablicy i nie zakładamy, że jest ona tablicą.
Wywołanie ostatniego wiersza każdej z powyższych metod dla
1000000
czasów prowadzi do następujących wyników testów porównawczych:Korzystanie ze stringów [i]
0.24960017204285 Seconds
Korzystanie z str_split
0.18720006942749 Seconds
Co oznacza, że druga metoda jest znacznie szybsza.
źródło
Hmm ... Nie ma potrzeby komplikować sprawy. Podstawy zawsze działają świetnie.
Kierunek do przodu:
Wyjścia:
abcdef
Odwrotny kierunek:
Wyjścia:
fedcba
źródło
źródło
Większość odpowiedzi zapomniała o nieangielskich znakach !!!
strlen
liczy bajty, a nie znaki, dlatego tak jest i jego funkcje siostrzane działają dobrze ze znakami angielskimi, ponieważ angielskie znaki są przechowywane w 1 bajcie zarówno w kodowaniu UTF-8, jak i ASCII, musisz użyć funkcji wielobajtowych ciągów znakówmb_*
To zadziała z każdym znakiem zakodowanym w
UTF-8
To wychodzi
źródło