PHP indexação de matriz:$matriz[$index] vs $matriz["$index"] vs $matriz["{$index}"]
Pergunta
Qual é a diferença, se a houver, entre estes métodos de indexação em uma matriz PHP:
$array[$index]
$array["$index"]
$array["{$index}"]
Eu estou interessado em tanto o desempenho e diferenças funcionais.
Atualização:
(Em resposta ao @Jeremy) eu não tenho certeza de que está certo.Fiz esse código:
$array = array(100, 200, 300);
print_r($array);
$idx = 0;
$array[$idx] = 123;
print_r($array);
$array["$idx"] = 456;
print_r($array);
$array["{$idx}"] = 789;
print_r($array);
E tem esta saída:
Array
(
[0] => 100
[1] => 200
[2] => 300
)
Array
(
[0] => 123
[1] => 200
[2] => 300
)
Array
(
[0] => 456
[1] => 200
[2] => 300
)
Array
(
[0] => 789
[1] => 200
[2] => 300
)
Solução
veja @svec e @jeremy acima.Todos os arrays são do tipo 'int' primeiro, em seguida, tipo 'cadeia de caracteres', e serão lançados para que, como PHP vê o ajuste.
O desempenho do sábio, $índice deve ser mais rápido do que o "$index" e "{$index}" (que são os mesmos).
Uma vez que você iniciar uma proposta de duplo cadeia, o PHP irá passar para o modo de interpolação e tratá-lo como uma seqüência de primeira, mas olhando para a variável marcadores ($, {}, etc.) para substituir a partir do âmbito local.É por isso que na maioria das discussões, verdadeiro 'estático', seqüências de caracteres deve estar sempre entre aspas simples, a menos que você precisa escapar com atalhos como " " ou " ", porque o PHP não precisa tente interpolar a cadeia em tempo de execução e a cadeia completa pode ser compilado estaticamente.
Neste caso, doublequoting primeiro copie o $índice para essa seqüência de caracteres e, em seguida, retornará a seqüência de caracteres, onde a usar directamente $índice, irá retornar a string.
Outras dicas
Eu cronometrei o 3 formas de utilização de um índice como este:
for ($ii = 0; $ii < 1000000; $ii++) {
// TEST 1
$array[$idx] = $ii;
// TEST 2
$array["$idx"] = $ii;
// TEST 3
$array["{$idx}"] = $ii;
}
O primeiro conjunto de testes utilizados $idx=0
, o segundo conjunto usado $idx="0"
, e o terceiro conjunto usado $idx="blah"
.Tempo foi feita usando microtime()
diffs.Eu estou usando WinXP, PHP 5.2, Apache 2.2, e Vim.:-)
E aqui estão os resultados:
Usando $idx = 0
$array[$idx] // time: 0.45435905456543 seconds
$array["$idx"] // time: 1.0537171363831 seconds
$array["{$idx}"] // time: 1.0621709823608 seconds
ratio "$idx" / $idx // 2.3191287282497
ratio "{$idx}" / $idx // 2.3377348193858
Usando $idx = "0"
$array[$idx] // time: 0.5107250213623 seconds
$array["$idx"] // time: 0.77445602416992 seconds
$array["{$idx}"] // time: 0.77329802513123 seconds
ratio "$idx" / $idx // = 1.5163855142717
ratio "{$idx}" / $idx // = 1.5141181512285
Usando $idx = "blah"
$array[$idx] // time: 0.48077392578125 seconds
$array["$idx"] // time: 0.73676419258118 seconds
$array["{$idx}"] // time: 0.71499705314636 seconds
ratio "$idx" / $idx // = 1.5324545551923
ratio "{$idx}" / $idx // = 1.4871793473086
Então, $array[$idx]
é o vencedor mãos para baixo o desempenho da concorrência, pelo menos na minha máquina.(Os resultados foram muito repetitivo, BTW, eu corri 3 ou 4 vezes e obtive os mesmos resultados.)
Eu acredito que a partir de um desempenho perspectiva-se que us $matriz["$index"] é mais rápido do que $matriz[$index] Ver Melhor práticas para otimizar o código PHP desempenho
Não acredite em tudo que ler, então cegamente...Eu acho que você mal interpretado que.O artigo diz que us $array['index'] é mais rápido do que $array[indice] onde o índice é um cadeia, não uma variável.Isso porque se você não enrole-a entre aspas PHP procura por uma constante var e não consegue encontrar um modo assume que você deve fazer é uma seqüência de caracteres.
Quando a indexação diferentes métodos para resolver diferentes índices?
De acordo com a http://php.net/types.array, um índice de matriz só pode ser um inteiro ou uma string.Se você tentar usar um carro alegórico como um índice, ele irá truncar-lo para inteiro.Por isso, se $index
é um float com o valor 3.14, em seguida, $array[$index]
irá avaliar a $array[3]
e $array["$index"]
irá avaliar a $array['3.14']
.Aqui está um código que confirma isso:
$array = array(3.14 => 'float', '3.14' => 'string');
print_r($array);
$index = 3.14;
echo $array[$index]."\n";
echo $array["$index"]."\n";
A saída:
Array([3] => float [3.14] => string)
float
string
Resposta para a Atualização:
Oh, você está certo, eu acho que o PHP deve converter índice de matriz de strings para números se eles conter apenas dígitos.Eu tentei este código:
$array = array('1' => 100, '2' => 200, 1 => 300, 2 => 400);
print_r($array);
E o resultado foi:
Array([1] => 300 [2] => 400)
Fiz mais alguns testes e constatou que se um índice de matriz (ou chave) é feita somente de dígitos, é sempre convertido para um inteiro, caso contrário é uma seqüência de caracteres.
ejunker:
Você pode explicar por que é mais rápido?Não é necessário o intérprete de um passo extra para analisar "$índice" na seqüência de caracteres a ser usado como um índice em vez de usar apenas $índice, o índice?
Se o índice é uma seqüência de caracteres não há nenhuma diferença, porque $index", $índice", e "{$index}" todas avaliar para a mesma cadeia.Se o índice é um número, por exemplo, 10, a primeira linha irá avaliar a $matriz[10] e as outras duas linhas irá avaliar a $matriz["10"], que é um elemento diferente de $array[10].
Eu acredito que a partir de uma perspectiva de desempenho que $matriz["$index"] é mais rápido do que $matriz[$index] Veja Melhores práticas para otimizar o desempenho de código PHP
Outra variação que eu uso às vezes, quando eu tiver uma matriz dentro de uma string é:
$str = "this is my string {$array["$index"]}";
Editar:O que eu quis dizer é que $row['id'] é mais rápido do que $row[id]