Quero receber a primeira letra de uma string e notei que $str[0]
funciona muito bem. Só não tenho certeza se isso é 'boa prática', pois essa notação é geralmente usada com matrizes. Esse recurso não parece estar muito bem documentado, por isso estou recorrendo a vocês para me dizer se está tudo bem - em todos os aspectos - usar essa notação?
Ou devo apenas me ater ao bom e velho substr($str, 0, 1)
?
Além disso, observei que chaves ( $str{0}
) também funcionam. O que há com isso?
Respostas:
Sim. As strings podem ser vistas como matrizes de caracteres, e a maneira de acessar uma posição de uma matriz é usar o
[]
operador. Normalmente, não há nenhum problema em usar$str[0]
(e tenho certeza que é muito mais rápido que osubstr()
método).Há apenas uma ressalva nos dois métodos: eles obterão o primeiro byte , e não o primeiro caractere . Isso é importante se você estiver usando codificações multibyte (como UTF-8). Se você deseja apoiar isso, use
mb_substr()
. Indiscutivelmente, você deve sempre assumir a entrada multibyte hoje em dia, portanto essa é a melhor opção, mas será um pouco mais lenta.fonte
mb_substr($str, 0, 1, 'utf-8')
lo para não truncar uma sequência de vários bytes.substr($str, 0, 1)
, isso confunde quem lê o código.A sintaxe {} está obsoleta no PHP 5.3.0. Os colchetes são recomendados.
fonte
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.
Então, eu estou pensando se eles decidiram que o uso{}
NÃO é mais descontinuado a partir do 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 essa sintaxe vai ficar por um tempo.Digamos que você queira apenas o primeiro caracter de uma parte de $ _POST, vamos chamá-lo de 'type'. E esse $ _POST ['type'] atualmente é 'Control'. Se, neste caso, se você usar
$_POST['type'][0]
, ousubstr($_POST['type'], 0, 1)
vocêC
voltará.No entanto, se o lado do cliente foram para modificar os dados que você enviar, a partir
type
detype[]
, por exemplo, e em seguida, enviar 'Control' e 'Test' como os dados para esta matriz,$_POST['type'][0]
vai agora regressarControl
ao invés deC
ao passosubstr($_POST['type'], 0, 1)
vai simplesmente falhar.Então, sim, pode haver um problema com o uso
$str[0]
, mas isso depende da circunstância circundante.fonte
if (true === is_string($_POST['type']))
Minha única dúvida seria a aplicabilidade dessa técnica em cadeias de bytes múltiplos, mas se isso não for considerado, suspeito que você esteja coberto. (Em caso de dúvida,
mb_substr()
parece uma escolha obviamente segura.)No entanto, de uma perspectiva geral, tenho que me perguntar quantas vezes você precisa acessar o caractere n-ésimo em uma string para que isso seja uma consideração importante.
fonte
Isso varia dependendo dos recursos, mas você pode executar o script abaixo e ver por si mesmo;)
Alguns números de referência (em uma máquina CoreDuo antiga)
Parece que o uso dos operadores
[]
ou{}
é mais ou menos o mesmo.fonte
testA
etestB
dentro dos mesmos loops significa que você é capaz de detectar, por exemplo, o fato de quetestB
um cache-killertestA
é compatível com o cache. Quando ambos estão no mesmo loop, são medidos para ter os mesmos tempos porque o cachetestB
poluídotestA
.microtime()
chamada compensaria a maior parte da diferença de tempo, embora experimentalmente isso pareça para não ser verdade), não há razão para se preocupar com a pequena diferença de velocidade aqui. É uma fração de milionésimo de segundo; quando é que isto nunca vai importar?Falando como um mero mortal, eu continuaria
$str[0]
. Para mim, é mais rápido entender o significado de$str[0]
uma olhada do quesubstr($str, 0, 1)
. Isso provavelmente se resume a uma questão de preferência.Quanto ao desempenho, bem, perfil perfil. :) Ou você pode examinar o código-fonte PHP ...
fonte
fonte
No caso de seqüências multibyte (unicode), o uso
str[0]
pode causar um problema.mb_substr()
é uma solução melhor. Por exemplo:Alguns detalhes aqui: Obtenha o primeiro caractere da string UTF-8
fonte
Também já usei essa notação, sem efeitos colaterais ruins e sem mal-entendidos. Faz sentido - afinal, uma string é apenas uma matriz de caracteres.
fonte
$str[42]
. Pense em uma string como uma matriz de caracteres para esse fim. Internamente, as seqüências de caracteres PHP são matrizes de bytes.$arr[] = $new_element
) não funciona em strings. Como tal, não acho útil conceber cadeias como matrizes de caracteres.