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?
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?
Respostas:
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);
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.
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!
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.
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_1DNKoiJKwotCqAycickBVhTy
e 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 $keyval
e $dbquery['fieldname']
parecia ser uma combinação perfeita (verificado visualmente ao exibir ambos no navegador). O mistério foi resolvido simplesmente usando trim
a 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 ...
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.
No array php você não pode usar a chave: 2.3 ou números decimais
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
é
não estiver presente, e se o OP não usar o Notepad ++ afinal?
$a = (object) ['@km³' => 123]; error_log($a->@km³);