Caracteres permitidos em chaves de array php?


86

Eu tenho algumas chaves de array php que são preenchidas com muitos caracteres estranhos.

Isso é permitido? Existem restrições ao que não posso usar?


Restrições:$a = (object) ['@km³' => 123]; error_log($a->@km³);
Bitterblue

Respostas:


90

De acordo com o manual :

A chave pode ser um número inteiro ou uma string. O valor pode ser de qualquer tipo.

Além disso, ocorrerão os seguintes keycasts:

  • Strings contendo inteiros válidos serão convertidos para o tipo inteiro. Por exemplo, a chave "8" será armazenada em 8. Por outro lado, "08" não será convertido, pois não é um inteiro decimal válido.
  • Flutuantes também são convertidos em inteiros, o que significa que a parte fracionária será truncada. Por exemplo, a chave 8.7 será armazenada em 8.
  • Os bools são convertidos em inteiros também, ou seja, a chave verdadeira será armazenada em 1 e a chave falsa em 0.
  • Null será lançado na string vazia, ou seja, a chave nula será armazenada em "".
  • Arrays e objetos não podem ser usados ​​como chaves. Isso resultará em um aviso: Tipo de deslocamento ilegal.

O manual novamente :

Uma string é uma série de caracteres, em que um caractere é igual a um byte. Isso significa que o PHP suporta apenas um conjunto de 256 caracteres e, portanto, não oferece suporte nativo a Unicode. Veja os detalhes do tipo de string.

Resumindo, qualquer string pode ser uma chave. E uma string pode conter quaisquer dados binários (até 2 GB). Portanto, uma chave pode ser qualquer dado binário (já que uma string pode ser qualquer dado binário).

Algum abuso aleatório (válido) de chaves de array:

$w = array(chr(0) => 'null byte?', chr(rand(0, 255)) => 'random byte?');
var_dump($w);

1
Para esclarecer, isso não significa que você não pode usar strings Unicode como chaves de array. Na verdade, qualquer string binária funciona bem. Acho irritante a autodescrita falta de suporte a Unicode do PHP, já que não é verdade. :)
deceze

1
@deceze Unicode se enquadra na categoria de "quaisquer dados binários" :) (embora eu suponha que com o texto do manual, suponha que seja necessário um esclarecimento). E dizer que "não oferece suporte nativo a Unicode" é verdade. O núcleo do PHP não inclui versões Unicode de strlen, substr, etc. Embora "não ofereça processamento nativo de strings Unicode" possa ser mais apropriado.
Corbin

3
Claro, o núcleo não contém nenhum recurso para manipular strings Unicode. Mas contanto que você não queira manipular strings, o PHP as suporta perfeitamente. E falando realisticamente, a extensão MB está disponível em praticamente todas as instalações do PHP por padrão, então a distinção entre "suporte básico" ou não é principalmente acadêmica. :)
deceze

1
@deceze talvez sua nota deva ser "não nativamente (ver extensão MB)" ou algo assim. Você está certo. Qualquer instalação de PHP desde 2005 suporta essencialmente Unicode, embora eu diria que o suporte de Unicode em PHP (com extensões) ainda é um pouco desagradável.
Corbin

@Corbin, por que você chama isso de abuso em vez de uso ?
Pacerier

12

A chave deve ser uma string ou um inteiro. Existem alguns moldes que ocorrem, mas acho que o manual faz um bom trabalho ao explicar:

A chave pode ser um número inteiro ou uma string. O valor pode ser de qualquer tipo.

Além disso, ocorrerão os seguintes keycasts:

  • Strings contendo inteiros válidos serão convertidos para o tipo inteiro. Por exemplo, a chave "8" será armazenada em 8. Por outro lado, "08" não será convertido, pois não é um inteiro decimal válido.
  • Flutuantes também são convertidos em inteiros, o que significa que a parte fracionária será truncada. Por exemplo, a chave 8.7 será armazenada em 8.
  • Os bools são convertidos em inteiros também, ou seja, a chave verdadeira será armazenada em 1 e a chave falsa em 0.
  • Null será lançado na string vazia, ou seja, a chave nula será armazenada em "".
  • Arrays e objetos não podem ser usados ​​como chaves. Isso resultará em um aviso: Tipo de deslocamento ilegal.

Os tipos de recursos podem ser convertidos em inteiros agora (não tenho certeza se este é um novo recurso), então você pode usar, por exemplo, um identificador de arquivo ou um identificador de curl como uma chave indiretamente, convertendo-o em inteiro e usando-o como a chave.
thomasrutter

10

Encontrei esta resposta procurando mais informações sobre um problema que tive. Eu estava usando strings com caracteres UTF-8, o que não funcionaria como chaves para um array que eu tinha.

Algo como

$str = "R&D - Solution";
$arr = array( "R&D - Solution" => "Research" );
echo $arr[$str];  // did not work

A solução (nem grande nem inteligente) para mim foi fazer isso ..

$str = md5("R&D - Solution");
$arr = array( md5("R&D - Solution") => "Research" );
echo $arr[$str];  // works!

2
Eu gosto de md5 () para gerar chaves de array. Mesmo que não seja totalmente necessário neste ponto, ainda parece mais seguro.
billynoah

1
md5 () é perfeito para gerar uma chave de texto simples de qualquer string. A segurança não é o problema. Também é bom que seja rápido. A única questão é se eles decidem suspender o uso e, em seguida, eliminá-lo, porque agora não é bom para o que foi originalmente projetado. Veremos.
Patanjali

2
Você estava usando uma versão anterior do PHP? Seu primeiro exemplo funciona bem no PHP 7.1.
Elliot B.

6

As chaves do array PHP podem ser inteiros ou strings. As strings PHP são matrizes de bytes, o que significa sequências de bytes. Não há outros tipos de strings e o PHP não impõe nenhuma restrição especial às strings de chaves de array. Em outras palavras: contanto que seja uma string, vale tudo.


Acho que a conversão implícita de uma string para uma chave inteira é uma distinção importante a ser feita, uma vez que certas funções operam de maneira diferente se a chave for um número inteiro ou não. por exemplo, você pode usar números de string arbitrários apenas para descobrir que uma função de matriz posteriormente os reindexa de 0..n-1.
Mateus

1
Concordo, mas acho que está no limite do escopo desta questão. :)
deceze

5

Qualquer coisa que você inserir em uma string PHP pode ser usada como uma chave de array. Não há limite de caracteres permitidos.

$a = array();

$x = 'long string of random garage';
echo $a[$x]; // this is ok

$x = array();
echo $a[$x]; // not ok

1

Se chaves complexas estiverem causando um erro de "índice indefinido", você pode simplesmente ter um problema de "corte".

Eu estava enlouquecendo porque uma chave complexa estava emitindo o erro "índice indefinido" e pensei que talvez fosse uma violação de sintaxe. A chave da matriz que causa o erro foi construída a partir de um campo de uma consulta de banco de dados MySQL que eu estava convertendo em uma chave e usando em uma nova matriz. A chave era assim: pl_1DNKoiJKwotCqAycickBVhTye aqui está como o código foi construído.

//new array created from database query
$new_array[$dbquery['fieldname']] = {some value};

//key value found in field of second array
$keyval = $array_two['fieldname'];

//this produced the "undefined index" error
echo $new_array[$keyval];

quando, na verdade, o $keyvale $dbquery['fieldname']parecia ser uma combinação perfeita (verificado visualmente ao exibir ambos no navegador). O mistério foi resolvido simplesmente usando trima segunda declaração como esta: $keyval = trim($array_two['fieldname']);Uma vez 'cortado', o php não reclamava mais.

Esperando que isso salve alguns outros de alguns momentos frustrantes ...


0

Pessoalmente, não tive problemas com caracteres incomuns em chaves de array. O que é e o que não é legal não está bem documentado, exceto para dizer que a chave deve ser um escalar. Sua melhor aposta é apenas experimentar e ver.


Um pouco inconsistente, sim, mas está bem documentado.
Corbin

0

Além de todas as respostas, pois são verdadeiras: Você pode usar PSRs que são algum tipo de regra entre os melhores programadores para ter um estilo de codificação padrão e agradável.


0

No array php você não pode usar a chave: 2.3 ou números decimais


-1

Codificar a página php em ANSI "é" poderá ser usada (Cinéma não aparecerá como Cinéma). No Notepad ++ basta usar o menu Codificar => Converter ANSI e salvar


2
(Esta postagem não parece fornecer uma resposta de qualidade para a pergunta. Edite sua resposta ou apenas poste como um comentário à pergunta).
sɐunıɔ ןɐ qɐp

Você pode explicar isso melhor? E se énão estiver presente, e se o OP não usar o Notepad ++ afinal?
Nico Haase
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.