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.