PHP prefixa array associativo com chaves literais?

112

É possível preceder uma matriz associativa com pares de chave => valor literal? Eu sei que array_unshift () funciona com teclas numéricas, mas espero algo que funcione com teclas literais.

Como exemplo, gostaria de fazer o seguinte:

$array1 = array('fruit3'=>'apple', 'fruit4'=>'orange');
$array2 = array('fruit1'=>'cherry', 'fruit2'=>'blueberry');

// prepend magic

$resulting_array = ('fruit1'=>'cherry', 
                    'fruit2'=>'blueberry', 
                    'fruit3'=>'apple', 
                    'fruit4'=>'orange');
Colin Brock
fonte

Respostas:

219

Você não pode simplesmente fazer:

$resulting_array = $array2 + $array1;

?

cletus
fonte
15
Veja também array_merge () e sua diferença de usar o operador +: br.php.net/manual/en/function.array-merge.php#92602
Havenard
2
@cletus: Sheesh. Sim eu posso. Não tenho certeza do que me fez pensar que não poderia ou o que não estava funcionando antes. Obrigado pela resposta.
Colin Brock,
É importante notar a diferença, mas essa diferença é relevante para preservar as chaves numéricas e esta matriz é uma matriz associativa "pura" com chaves de string.
cletus
29

A resposta é não. Você não pode preceder uma matriz associativa com um par de valores-chave.

No entanto, você pode criar uma nova matriz que contém o novo par de valores-chave no início da matriz com o operador de união + . O resultado é um array inteiramente novo, e criar o novo array tem complexidade O (n).

A sintaxe está abaixo.

$new_array = array('new_key' => 'value') + $original_array;

Nota: Não use array_merge (). array_merge () sobrescreve as chaves e não preserva as chaves numéricas.

PHPguru
fonte
"sobrescreve as chaves e não preserva as chaves numéricas" ... a) como o operador de união ("+") trata as chaves "duplicadas"? re: não preservar as chaves numéricas: provavelmente desejado
Brad Kent
16

Em sua situação, você deseja usar array_merge ():

array_merge(array('fruit1'=>'cherry', 'fruit2'=>'blueberry'), array('fruit3'=>'apple', 'fruit4'=>'orange'));

Para prefixar um único valor, para uma matriz associativa, em vez de array_unshift (), novamente use array_merge ():

array_merge(array($key => $value), $myarray);
mvpetrovich
fonte
5

@Cletus está certo. Apenas para adicionar, se a ordem dos elementos nas matrizes de entrada for ambígua e você precisar que a matriz final seja classificada, você pode querer ksort :

$resulting_array = $array1 + $array2;
ksort($resulting_array);
karim79
fonte
4
Como uma observação tardia, ksortretorna booleano, então o acima precisa ser feito como duas instruções, não uma, por exemplo $a = $array1 + $array2; ksort($a);, caso contrário, $resulting_arrayserá um valor booleano e não o array que você esperava.
El Yobo,
3

Usando o mesmo método de @mvpetrovich, você pode usar a versão abreviada de uma matriz para reduzir a sintaxe.

$_array = array_merge(["key1" => "key_value"], $_old_array);

Referências:

PHP: array_merge ()

PHP: Arrays - Manual

A partir do PHP 5.4 você também pode usar a sintaxe de array abreviado, que substitui array () por [].

Bryce Gough
fonte