ultimo - extraer caracteres de una cadena php
Obtención del primer carácter de una cadena con $ str (12)
Quiero obtener la primera letra de una cadena y he notado que $str[0]
funciona muy bien. Simplemente no estoy seguro de si esto es una "buena práctica", ya que esa notación se utiliza generalmente con matrices. Esta característica no parece estar muy bien documentada, así que me dirijo a ustedes para decirme si está bien, en todos los aspectos, ¿para usar esta notación?
¿O debería simplemente atenerme a los buenos substr($str, 0, 1)
?
También noté que las llaves ( $str{0}
) también funcionan. ¿Que pasa con eso?
Así resolví el problema:
<?php
$string = ''Hello The World'';
$stringExp = explode('' '', $string);
$shortCode = '''';
for($i = 0; $i < count($stringExp); $i++):
$shortCode .= substr($stringExp[$i], 0, 1);
endfor;
echo $shortCode; // result : HTW
?>
Considera lo siguiente:
<?php
var_dump($_POST);
// Post var is a string:
echo ''1''; var_dump( strtoupper( $_POST[''flag1''][0] ) === ''T'' ); // boolean true
echo ''2''; var_dump( strtoupper( substr( $_POST[''flag1''],0,1 ) ) === ''T'' ); // boolean true
// Post var is an array of strings
echo ''5''; var_dump( strtoupper( $_POST[''flag2''][0] ) === ''T'' ); // boolean false
echo ''6''; var_dump( strtoupper( substr( $_POST[''flag2''],0,1 ) ) === ''T'' ); // generates a PHP warning
?>
<hr />
<form method="POST">
<input type="text" name="name" value="bob" /><br />
<input type="text" name="flag1" value="true" /><br />
<select name="flag2[]" multiple>
<option value="true" selected>true</option>
<option value="false" selected>false</option>
<option value="0" selected>0</option>
</select><br />
<input type="submit" value="Submit" /><br />
</form>
La intención es detectar una bandera booleana. Aunque es posible confundir el problema al convertir la var en un tipo de matriz, el uso de la notación de subíndice de matriz produce un resultado falso seguro, mientras que la función substr () produce un error. Dada la elección aquí, me gustaría ir con la notación de subíndice.
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 usa $_POST[''type''][0]
, o substr($_POST[''type''], 0, 1)
obtendrá C
vuelta.
Sin embargo, si el lado del cliente modificara los datos que le envían, de type
a type[]
por ejemplo, y luego envíe ''Control'' y ''Prueba'' como los datos para esta matriz, $_POST[''type''][0]
ahora devolverá Control
lugar de C
mientras que substr($_POST[''type''], 0, 1)
simplemente fallará.
Entonces sí, puede haber un problema con el uso de $str[0]
, pero eso depende de la circunstancia circundante.
En el caso de cadenas multibyte (Unicode), el uso de str[0]
puede causar problemas. mb_substr()
es una mejor solución. Por ejemplo:
$first_char = mb_substr($title, 0, 1);
Algunos detalles aquí: Obtén el primer carácter de la cadena UTF-8
Es fácil obtener el primer carácter de una cadena. Solo trata la cadena como una matriz.
Ejemplo:
$first = $string{0};
$fifth = $string{5};
¡Eso es!
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]
de un vistazo que substr($str, 0, 1)
. Esto probablemente se reduce a una cuestión de preferencia.
En cuanto al rendimiento, bueno, perfil perfil perfil. :) O puedes mirar en el código fuente de PHP ...
La sintaxis {} está en desuso a partir de PHP 5.3.0. Se recomiendan los corchetes.
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.
Sí. 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 []
. Usualmente, no hay ningún problema en usar $str[0]
(y estoy bastante seguro de que es mucho más rápido que el método substr()
).
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 admitir eso, usa mb_substr()
. Podría decirse que siempre debe suponer una entrada multibyte en estos días, por lo que esta es la mejor opción, pero será un poco más lenta.
También he usado esa notación antes, sin efectos secundarios negativos ni malentendidos. Tiene sentido: una cadena es solo una matriz de caracteres, después de todo.
Variará dependiendo de los recursos, pero puede ejecutar el siguiente script y verlo por sí mismo;)
<?php
$tests = 100000;
for ($i = 0; $i < $tests; $i++)
{
$string = md5(rand());
$position = rand(0, 31);
$start1 = microtime(true);
$char1 = $string[$position];
$end1 = microtime(true);
$time1[$i] = $end1 - $start1;
$start2 = microtime(true);
$char2 = substr($string, $position, 1);
$end2 = microtime(true);
$time2[$i] = $end2 - $start2;
$start3 = microtime(true);
$char3 = $string{$position};
$end3 = microtime(true);
$time3[$i] = $end3 - $start3;
}
$avg1 = array_sum($time1) / $tests;
echo ''the average float microtime using "array[]" is ''. $avg1 . PHP_EOL;
$avg2 = array_sum($time2) / $tests;
echo ''the average float microtime using "substr()" is ''. $avg2 . PHP_EOL;
$avg3 = array_sum($time3) / $tests;
echo ''the average float microtime using "array{}" is ''. $avg3 . PHP_EOL;
?>
Algunos números de referencia (en una máquina CoreDuo antigua)
$ php 1.php
the average float microtime using "array[]" is 1.914701461792E-6
the average float microtime using "substr()" is 2.2536706924438E-6
the average float microtime using "array{}" is 1.821768283844E-6
$ php 1.php
the average float microtime using "array[]" is 1.7251944541931E-6
the average float microtime using "substr()" is 2.0931363105774E-6
the average float microtime using "array{}" is 1.7225742340088E-6
$ php 1.php
the average float microtime using "array[]" is 1.7293763160706E-6
the average float microtime using "substr()" is 2.1037721633911E-6
the average float microtime using "array{}" is 1.7249774932861E-6
Parece que usar los operadores []
o {}
es más o menos lo mismo.
$str = ''abcdef'';
echo $str[0]; // a