Quiero obtener la primera letra de una cadena y he notado que $str[0]
funciona muy bien. Simplemente no estoy seguro de si esta es una 'buena práctica', ya que esa notación generalmente se usa con matrices. Esta característica no parece estar muy bien documentada, así que me dirijo a ustedes para que me digan si está bien, en todos los aspectos, ¿usar esta notación?
¿O debería seguir con lo bueno substr($str, 0, 1)
?
Además, noté que las llaves ( $str{0}
) también funcionan. ¿Que pasa con eso?
Respuestas:
Si. Las cadenas se pueden ver como matrices de caracteres, y la forma de acceder a una posición de una matriz es usar el
[]
operador. Por lo general, no hay ningún problema en el uso$str[0]
(y estoy bastante seguro de que es mucho más rápido que elsubstr()
método).Solo hay una advertencia con ambos métodos: obtendrán el primer byte , en lugar del primer carácter . Esto es importante si está utilizando codificaciones multibyte (como UTF-8). Si quieres apoyar eso, úsalo
mb_substr()
. Podría decirse que siempre debe asumir la entrada multibyte en estos días, por lo que esta es la mejor opción, pero será un poco más lenta.fuente
mb_substr($str, 0, 1, 'utf-8')
hacerlo para no truncar una cadena multibyte.substr($str, 0, 1)
, esto confunde a quién lee el código.La sintaxis {} está en desuso a partir de PHP 5.3.0. Se recomiendan corchetes.
fuente
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.
así que me pregunto si decidieron que el uso{}
ya no está en desuso a partir de 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.
Parece que esta sintaxis se mantendrá por un tiempo.Digamos que solo quieres el primer carácter de una parte de $ _POST, llamémoslo 'tipo'. Y ese $ _POST ['tipo'] es actualmente 'Control'. Si en este caso si lo usa
$_POST['type'][0]
, osubstr($_POST['type'], 0, 1)
volveráC
.Sin embargo, si el cliente tuviera que modificar los datos que le envían, a partir
type
detype[]
, por ejemplo, y, a continuación, enviar 'Control' y 'prueba' como los datos para esta matriz,$_POST['type'][0]
ahora volveráControl
en lugar deC
que,substr($_POST['type'], 0, 1)
simplemente acaba de fallar.Entonces, sí, puede haber un problema con el uso
$str[0]
, pero eso depende de las circunstancias circundantes.fuente
if (true === is_string($_POST['type']))
Mi única duda sería cuán aplicable sería esta técnica en cadenas de varios bytes, pero si eso no es una consideración, entonces sospecho que está cubierto. (En caso de duda,
mb_substr()
parece una opción obviamente segura).Sin embargo, desde una perspectiva general, tengo que preguntarme con qué frecuencia necesita acceder al carácter 'n' en una cadena para que esto sea una consideración clave.
fuente
Varía según los recursos, pero puede ejecutar el script a continuación y verlo usted mismo;)
Algunos números de referencia (en una vieja máquina CoreDuo)
Parece que usar los operadores
[]
o{}
es más o menos lo mismo.fuente
testA
ytestB
dentro de los mismos bucles significa que usted es capaz de detectar, por ejemplo, el hecho de quetestB
es un asesino detestA
caché mientras que es compatible con caché. Cuando ambos están en el mismo bucle, se mide que tienen los mismos tiempos porquetestB
eltestA
almacenamiento en caché está contaminado .microtime()
llamada supondría la mayor parte de la diferencia horaria, aunque experimentalmente eso parece para no ser cierto), no hay razón para preocuparse por la pequeña diferencia de velocidad aquí. Es una fracción de una millonésima de segundo; cuando se presente alguna vez va a importar?Hablando como un simple mortal, me quedaría con
$str[0]
. En lo que a mí respecta, es más rápido comprender el significado de$str[0]
un vistazo quesubstr($str, 0, 1)
. Esto probablemente se reduce a una cuestión de preferencia.En cuanto al rendimiento, bueno, perfil perfil perfil. :) O podrías mirar el código fuente de PHP ...
fuente
fuente
En el caso de cadenas multibyte (unicode), el uso
str[0]
puede causar problemas.mb_substr()
Es una mejor solución. Por ejemplo:Algunos detalles aquí: Obtenga el primer carácter de la cadena UTF-8
fuente
También he usado esa notación antes, sin efectos secundarios negativos y sin malentendidos. Tiene sentido: una cadena es solo una serie de caracteres, después de todo.
fuente
$str[42]
. Piense en una cadena como una matriz de caracteres para este propósito. Internamente, las cadenas PHP son conjuntos de bytes.$arr[] = $new_element
) no funciona en cadenas. Como tal, no creo que sea útil concebir cadenas como matrices de caracteres.