Chcę uzyskać pierwszą literę łańcucha i zauważyłem, że to $str[0]
działa świetnie. Po prostu nie jestem pewien, czy jest to „dobra praktyka”, ponieważ notacja ta jest zwykle używana w przypadku tablic. Ta funkcja nie wydaje się być zbyt dobrze udokumentowana, więc zwracam się do was z prośbą, aby powiedzieć, czy w ogóle - pod każdym względem - użyć tej notacji?
A może powinienem po prostu trzymać się dobrej starej substr($str, 0, 1)
?
Zauważyłem również, że nawiasy klamrowe ( $str{0}
) również działają. O co chodzi?
Odpowiedzi:
Tak. Ciągi mogą być postrzegane jako tablice znaków, a sposobem dostępu do pozycji tablicy jest użycie
[]
operatora. Zwykle nie ma żadnego problemu z używaniem$str[0]
(i jestem pewien, że jest znacznie szybszy niżsubstr()
metoda).Istnieje tylko jedno zastrzeżenie dotyczące obu metod: otrzymają one pierwszy bajt , a nie pierwszy znak . Jest to ważne, jeśli używasz kodowania wielobajtowego (takiego jak UTF-8). Jeśli chcesz to wesprzeć, użyj
mb_substr()
. Prawdopodobnie w dzisiejszych czasach należy zawsze zakładać wprowadzanie danych wielobajtowych, więc jest to najlepsza opcja, ale będzie ona nieco wolniejsza.źródło
mb_substr($str, 0, 1, 'utf-8')
tym, aby nie obcinać ciągu wielobajtowego.substr($str, 0, 1)
, to myli, kto czyta kod.Składnia {} jest przestarzała od PHP 5.3.0. Zalecane są nawiasy kwadratowe.
źródło
Note: Strings may also be accessed using braces, as in $str{42}, for the same purpose. However, this syntax is deprecated as of PHP 5.3.0. Use square brackets instead, such as $str[42].
Note: Strings may also be accessed using braces, as in $str{42}, for the same purpose.
Zastanawiam się więc, czy zdecydowali, że używanie{}
NIE jest już przestarzałe od PHP 6The curly-brackets-string-index-accessor-syntax does not emit any deprecation notice, although the original notice have been on and off for PHP 5.x, it does not in the current version, thrus we should not label it as deprecated. Related to bug #52254
- svn.php.net/repository/phpdoc/en/trunk/language/types/…Note: Strings may also be accessed using braces, as in $str{42}, for the same purpose.
Wygląda na to, że ta składnia pozostanie na jakiś czas.Powiedzmy, że chcesz tylko pierwszego znaku z części $ _POST, nazwijmy go „typ”. A ten $ _POST [„typ”] jest obecnie „Kontrolą”. Jeśli w tym przypadku, jeśli używasz
$_POST['type'][0]
, albosubstr($_POST['type'], 0, 1)
dostanieszC
z powrotem.Jednakże, jeśli po stronie klienta były zmodyfikować dane wysyłają od
type
dotype[]
na przykład, a następnie wysłać „kontrola” i „test” jako danych dla tej tablicy,$_POST['type'][0]
będzie teraz powrócićControl
zamiastC
natomiastsubstr($_POST['type'], 0, 1)
po prostu po prostu zawodzą.Tak, może być problem z używaniem
$str[0]
, ale zależy to od otaczających okoliczności.źródło
if (true === is_string($_POST['type']))
Moje jedyne wątpliwości dotyczyłyby zastosowania tej techniki do łańcuchów wielobajtowych, ale jeśli nie jest to rozważane, podejrzewam, że jesteś objęty. (W razie wątpliwości
mb_substr()
wydaje się to oczywiście bezpieczny wybór.)Jednak z ogólnej perspektywy muszę zastanawiać się, jak często trzeba uzyskiwać dostęp do n-tego znaku w ciągu, aby było to kluczowym czynnikiem.
źródło
Będzie się różnić w zależności od zasobów, ale możesz uruchomić skrypt poniżej i przekonaj się sam;)
Niektóre numery referencyjne (na starej maszynie CoreDuo)
Wydaje się, że korzystanie z operatorów
[]
lub{}
jest mniej więcej takie samo.źródło
testA
itestB
w obrębie tej samej pętli oznacza, że jesteś w stanie wykrywać na przykład fakt, żetestB
jest cache-zabójca, gdytestA
jest cache w obsłudze. Kiedy oba są w tej samej pętli, mierzone są tak, aby miały te same czasy, ponieważ buforowane przeztestB
zanieczyszczonetestA
.microtime()
połączenia stanowiłby większość różnicy czasu, choć wydaje się to eksperymentalnie nie jest prawdą), nie ma powodu, aby przejmować się drobną różnicą prędkości tutaj. To ułamek milionowej sekundy; gdy jest to zawsze będzie ważne?Mówiąc jak zwykły śmiertelnik, trzymałbym się
$str[0]
. Jeśli o mnie chodzi, szybsze jest zrozumienie znaczenia$str[0]
na pierwszy rzut oka niżsubstr($str, 0, 1)
. Prawdopodobnie sprowadza się to do preferencji.Jeśli chodzi o wydajność, to profil profilu profil. :) Lub możesz zajrzeć do kodu źródłowego PHP ...
źródło
źródło
W przypadku łańcuchów wielobajtowych (Unicode) używanie
str[0]
może powodować problemy.mb_substr()
jest lepszym rozwiązaniem. Na przykład:Kilka szczegółów tutaj: Uzyskaj pierwszy znak ciągu UTF-8
źródło
Używałem tego zapisu również wcześniej, bez żadnych niepożądanych skutków ubocznych i nieporozumień. Ma to sens - w końcu ciąg znaków to po prostu tablica znaków.
źródło
$str[42]
. W tym celu pomyśl o łańcuchu jako tablicy znaków. Wewnętrznie łańcuchy PHP są tablicami bajtowymi.$arr[] = $new_element
) nie działa na łańcuchach. W związku z tym nie sądzę, aby tworzenie łańcuchów znaków jako tablic znaków było przydatne.