PHP indexação de matriz:$matriz[$index] vs $matriz["$index"] vs $matriz["{$index}"]

StackOverflow https://stackoverflow.com/questions/6628

  •  08-06-2019
  •  | 
  •  

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
)
Foi útil?

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]

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top