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.
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:
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 ..
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
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" errorecho $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 ...
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.
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
$a = (object) ['@km³' => 123]; error_log($a->@km³);
Respostas:
De acordo com o manual :
O manual novamente :
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);
fonte
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:
fonte
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!
fonte
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.
fonte
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
fonte
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 usandotrim
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 ...
fonte
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.
fonte
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.
fonte
No array php você não pode usar a chave: 2.3 ou números decimais
fonte
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
fonte
é
não estiver presente, e se o OP não usar o Notepad ++ afinal?