Como anexar uma matriz a outra sem comparar suas chaves?
$a = array( 'a', 'b' );
$b = array( 'c', 'd' );
No final, deve ser: Array( [0]=>a [1]=>b [2]=>c [3]=>d )
Se eu usar algo como []
ou array_push
, causará um destes resultados:
Array( [0]=>a [1]=>b [2]=>Array( [0]=>c [1]=>d ) )
//or
Array( [0]=>c [1]=>d )
Apenas deveria ser algo, fazendo isso, mas de uma maneira mais elegante:
foreach ( $b AS $var )
$a[] = $var;
array_merge ($a, $b)
deve fazer exatamente o que você deseja, pelo menos com o PHP 5+.array_merge();
saída dearray_merge();
deve ser exatamente o que você precisa:print_r(array_merge($a,$b)); // outputs => Array ( [0] => a [1] => b [2] => c [3] => d )
Respostas:
array_merge
é a maneira elegante:Fazendo algo como:
Não funcionará, porque o
+
operador não os mescla. Se eles$a
tiverem as mesmas chaves$b
, não fará nada.fonte
Outra maneira de fazer isso no PHP 5.6+ seria usar o
...
tokenIsso também funcionará com qualquer
Traversable
Um aviso, porém:
$b
for uma matriz vazia ou não for passível de passagem, por exemplo, não uma matriz$b
não for possível atravessarfonte
...
comumente referido como osplat operator
em php.array_push
aceita um argumento único desde o php 7.3, que evita erros com matrizes vazias.Por que não usar
Por que você não deseja usar esse método correto e interno?
fonte
PHP append one array to another (not array_merge or array_push)
... posteriormente modificado paraPHP append one array to another (not array_merge or +)
antes de mudar para o título atualÉ um post bastante antigo, mas quero adicionar algo sobre como anexar um array a outro:
E se
você pode usar funções de matriz como esta:
array_merge não mescla chaves numéricas, portanto acrescenta todos os valores de $ appendArray. Ao usar funções php nativas em vez de um loop foreach, deve ser mais rápido em matrizes com muitos elementos.
Adição 2019-12-13: Desde o PHP 7.4, existe a possibilidade de acrescentar ou acrescentar arrays da maneira Array Spread Operator:
Como antes, as chaves podem ser um problema com este novo recurso:
"Erro fatal: Erro não capturado: Não é possível descompactar a matriz com chaves de seqüência de caracteres"
matriz (4) {[1] => int (1) [4] => int (2) [5] => int (3) [6] => int (4)}
matriz (3) {[0] => int (1) [1] => int (4) [3] => int (3)}
fonte
Resultado:
Código Fonte de Referência
fonte
Para grandes matrizes, é melhor concatenar sem array_merge, para evitar uma cópia de memória.
fonte
Seguindo as respostas de bstoney e Snark, fiz alguns testes nos vários métodos:
O que produz:
ORIGINAL: Acredito que, a partir do PHP 7, o método 3 é uma alternativa significativamente melhor devido à maneira como cada loop atua agora , que é fazer uma cópia da matriz que está sendo iterada.
Embora o método 3 não seja estritamente uma resposta aos critérios de 'not array_push' na pergunta, é uma linha e o desempenho mais alto em todos os aspectos, acho que a pergunta foi feita antes da sintaxe ... ser uma opção.
ATUALIZAÇÃO 25/03/2020: Atualizei o teste com defeito, pois as variáveis não foram redefinidas. De maneira interessante (ou confusa), os resultados agora mostram que o teste 1 é o mais rápido, onde foi o mais lento, tendo passado de 0,008392 para 0,002717! Isso só pode ser devido às atualizações do PHP, pois isso não teria sido afetado pela falha de teste.
Então, a saga continua, vou começar a usar array_merge a partir de agora!
fonte
Desde o PHP 7.4 você pode usar o ... operador . Isso também é conhecido como operador splat em outros idiomas, incluindo Ruby.
Resultado
O operador Splat deve ter melhor desempenho que array_merge . Isso não é apenas porque o operador splat é uma estrutura de linguagem, enquanto array_merge é uma função, mas também porque a otimização do tempo de compilação pode ter desempenho para matrizes constantes.
Além disso, podemos usar a sintaxe do operador splat em qualquer lugar da matriz, pois elementos normais podem ser adicionados antes ou depois do operador splat.
fonte
Antes do PHP7, você pode usar:
array_splice()
opera com referência à matriz (1º argumento) e coloca os valores da matriz (4º argumento) no lugar da lista de valores iniciados no 2º argumento e no número do 3º argumento. Quando definimos o 2º argumento como final da matriz de origem e o 3º como zero, acrescentamos o 4º valor do argumento ao 1º argumentofonte
se você deseja mesclar matriz vazia com o novo valor existente. Você deve inicializá-lo primeiro.
Espero que ajude.
fonte
O loop foreach é mais rápido que o array_merge para anexar valores a um array existente; portanto, escolha o loop se desejar adicionar um array ao final de outro.
fonte
Que tal agora:
fonte
'0' => 'a'
... em vez de0 => 'a'
?array + array