Melhor maneira de inicializar array (vazio) em PHP


297

Em outras linguagens (AS3, por exemplo), observou-se que a inicialização de uma nova matriz é mais rápida se for feita dessa maneira var foo = []do que var foo = new Array()por motivos de criação e instanciação de objetos. Gostaria de saber se existem equivalências em PHP?

class Foo {
    private $arr = array(); // is there another / better way?
}

11
É tudo o que faço.
Matthew

2
Obrigado a todos que responderam (e tão rapidamente!). Eu tive que selecionar arbitrariamente uma resposta, para que Andy parecesse o mais profundo.
Tom Auger

1
Esta pergunta ajuda muito #
317 Hitesh


2
@ zx1986 é uma maneira bastante complicada de criar uma matriz vazia. Certamente menos do que o OP $arr = array()ou$arr = []
Tom Auger

Respostas:


189

Nas implementações do ECMAScript (por exemplo, ActionScript ou JavaScript), Array()é uma função construtora e []faz parte da gramática literal da matriz. Ambos são otimizados e executados de maneiras completamente diferentes, com a gramática literal não sendo prejudicada pela sobrecarga de chamar uma função.

O PHP, por outro lado, possui construções de linguagem que podem parecer funções, mas não são tratadas como tal. Mesmo no PHP 5.4, que suporta []como alternativa, não há diferença na sobrecarga porque, no que diz respeito ao compilador / analisador, eles são completamente sinônimos.

// Before 5.4, you could only write
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// As of PHP 5.4, the following is synonymous with the above
$array = [
    "foo" => "bar",
    "bar" => "foo",
];

Se você precisar suportar versões mais antigas do PHP, use a sintaxe anterior. Há também um argumento para facilitar a leitura, mas, sendo um desenvolvedor de JS de longa data, este último me parece bastante natural. Na verdade, cometi o erro de tentar inicializar matrizes usando []quando aprendi PHP.

Essa alteração no idioma foi originalmente proposta e rejeitada devido a uma votação majoritária pelos principais desenvolvedores pelo seguinte motivo:

Este patch não será aceito porque uma pequena maioria dos desenvolvedores principais votou contra. Embora se você fizer uma média acumulada entre os desenvolvedores principais e os votos dos usuários, parece mostrar o contrário, seria irresponsável enviar um patch, o que não é suportado ou mantido a longo prazo.

No entanto, parece que houve uma mudança no coração que levou à versão 5.4, talvez influenciada pelas implementações de suporte a bancos de dados populares como o MongoDB (que usa a sintaxe ECMAScript).


51
Possivelmente, a mudança 5.4 foi feito porque as pessoas que poderia significar "que" assumiu o processo de votação :)
Rob Grant

40
Eu prefiro $array = [];, pois facilita a alternância entre JS e PHP.
23714 Justin justin

Então é $array = []; melhor opção ??? ou devo tentar outro. qual é o melhor
Hitesh

2
@ hitesh: é uma questão de preferência pessoal. Ambos são exatamente os mesmos funcionalmente, []é apenas um pouco mais fácil de digitar.
Andy E

7
A sintaxe [] parece ser universalmente preferida, mas é importante observar que existe um grande número de hosts ainda usando 5.3 exclusivamente. Se você deseja distribuir seu código, a sintaxe [] será fatal.
etc

204
$myArray = []; 

Cria uma matriz vazia.

Você pode enviar valores para a matriz posteriormente, da seguinte maneira:

$myArray[] = "tree";
$myArray[] = "house";
$myArray[] = "dog";

Nesse momento, $ myArray contém "árvore", "casa" e "cachorro". Cada um dos comandos acima se anexa à matriz, preservando os itens que já estavam lá.

Tendo vindo de outras línguas, essa maneira de acrescentar a uma matriz parecia estranha para mim. Eu esperava ter que fazer algo como $ myArray + = "dog" ou algo assim ... ou talvez um método "add ()" como as coleções do Visual Basic. Mas essa sintaxe de anexo direto certamente é curta e conveniente.

Você realmente precisa usar a função unset () para remover itens:

unset($myArray[1]); 

... removeria "casa" da matriz (matrizes são baseadas em zero).

unset($myArray); 

... destruiria toda a matriz.

Para ser claro, a sintaxe entre colchetes vazios para anexar a uma matriz é simplesmente uma maneira de dizer ao PHP para atribuir os índices a cada valor automaticamente, em vez de você atribuir os índices. Nos bastidores, o PHP está realmente fazendo isso:

$myArray[0] = "tree";
$myArray[1] = "house";
$myArray[2] = "dog";

Você pode atribuir índices você mesmo, se quiser, e pode usar os números que desejar. Você também pode atribuir números de índice a alguns itens e não a outros. Se você fizer isso, o PHP preencherá os números de índice ausentes, incrementando a partir do maior número de índice atribuído conforme ele for.

Então, se você fizer isso:

$myArray[10] = "tree";
$myArray[20] = "house";
$myArray[] = "dog";

... o item "dog" receberá um número de índice 21. O PHP não faz correspondência inteligente de padrões para atribuição incremental de índice, portanto, não saberá que você deseja que ele atribua um índice de 30 a "dog " Você pode usar outras funções para especificar o padrão de incremento para uma matriz. Não vou falar disso aqui, mas está tudo nos documentos do PHP.

Felicidades,

- = Cameron


6
É importante notar que $ ary = [] só funciona após o PHP 5.4. De uma perspectiva de desempenho, no entanto, não há vantagem para [] vs. array ().
Tom Auger

1
Para versões anteriores, você pode usar array_push () w3schools.com/php/func_array_push.asp Não sei se há um problema de desempenho associado a isso.
Mark

3
Você entendeu errado o ponto de @ TomAuger @ Mark. $array[] = 'foo'funciona bem em versões mais antigas do PHP. É apenas $array = [];para inicializar uma matriz que é nova na 5.4.
Codemonkey

Para ser justo, isso realmente responde à pergunta do OP.
Smitty

lol ... Mente explodida. Décadas de PHP e estou apenas aprendendo que você não precisa de array_push.
Bangkokian 14/08/19


26

No PHP, uma matriz é uma matriz; não há consideração primitiva versus objeto; portanto, não há otimização comparável.


1
A melhor resposta da IMO: existem sintaxes diferentes, mas em relação às performances, todas são iguais.
Matthieu Napoli

1
Existe problema de desempenho envolveu tanto para ..where posso verificar sobre este .. qualquer link ou doc
Hitesh

2
Como resultado, até que você tenha certeza de que seu código nunca será executado em ambientes anteriores à 5.4, use $ array = new array ()
Tom Auger

20

O que você está fazendo é 100% correto.

Em termos de boa nomeação, geralmente é feito que as propriedades privadas / protegidas sejam precedidas de um sublinhado para tornar óbvio que não são públicas. Por exemplo, private $_arr = array()oupublic $arr = array()


2
No php, acho melhor não nomeá-los com um sublinhado, pois você sempre usa $thispara obter o valor e nunca deve usar propriedades públicas.
meze

1
@ meeze você acessaria como $this->arre $this->_arr. Por que você nunca deve usar propriedades públicas ?!
James C

5

Tente o seguinte:

    $arr = (array) null;
    var_dump($arr);

    // will print
    // array(0) { }

4
Meio legal, mas mais como um truque do que como um padrão de codificação realmente útil, você não acha?
Tom Auger

Pode ser útil se você deseja criar sua matriz em um objeto com padrão de propriedades e convertê-la em matriz no final.
Jomar Sevillejo

4

Não há outra maneira , então este é o melhor.

Editar: Esta resposta não é válida desde o PHP 5.4 e superior.


Este não é mais o caso, a 5.4 introduziu uma sintaxe abreviada para matrizes.
Andy E

13
@Motes Por que tanto ódio: '(? Brincadeiras à parte, eu deixei isso mais explícito ao "atacar" a resposta antiga. Ainda pode ser útil para um novato entender que a resposta mudou.
Matthieu Napoli,

@Motes As pessoas perdem o ganho de representante da resposta quando a excluem. É melhor editá-lo.
Mbomb007 10/07/19

4

Inicializando uma matriz simples:

<?php $array1=array(10,20,30,40,50); ?>

Inicializando matriz dentro da matriz:

<?php  $array2=array(6,"santosh","rahul",array("x","y","z")); ?>

Fonte: Sorce para o código


3
A pergunta original era sobre como inicializar uma matriz vazia .
Tom Auger
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.