Você pode achar isso um pouco mais intuitivo. Requer apenas uma chamada de função para array_splice:
$original = array('a','b','c','d','e');
$inserted = array('x');// not necessarily an array, see manual quote
array_splice( $original,3,0, $inserted );// splice in at position 3// $original is now a b c x d e
Se a substituição for apenas um elemento, não é necessário colocar array () em torno dele, a menos que o elemento seja uma matriz em si, um objeto ou NULL.
É estranho que uma funcionalidade tão básica esteja realmente oculta, pois o principal objetivo dessa função, conforme descrito na documentação, é algo diferente (substituir itens nas matrizes). Sim, é indicado na seção de argumentos, mas se você estiver apenas digitalizando as descrições das funções para descobrir o que usar para inserir nas matrizes, nunca a encontrará.
Mahn
23
Apenas dizendo que isso não preservará as chaves na $insertedmatriz.
@JacerOmri está totalmente certo, ambas as declarações são válidas. Você pode transmitir um valor de qualquer tipo, mas ele pode não se comportar da mesma maneira para uma matriz, objeto ou nulo. Para escalares, a conversão de tipo (array)$scalaré equivalente a array($scalar), mas para uma matriz, um objeto ou nulo, ela será ignorada (matriz), convertida em uma matriz (objeto) ou se tornará uma matriz vazia (nula) - consulte php.net / manual / pt /…
Lukas
2
@ SunilPachlangia, adelval e outros: com matrizes multidimensionais, você precisa agrupar a substituição em uma matriz, está documentada. Eu ainda trouxe a nota aqui para que as pessoas parem de cometer o erro.
Félix Gagnon-Grenier
47
Uma função que pode ser inserida nas posições inteiro e string:
O array_splice()perde as chaves, enquanto array_merge()que não. Assim, os resultados da primeira função pode ser muito surpreendente ... Especialmente porque se você tem dois elementos com a mesma chave, apenas o valor do último é mantido ...
Embora seja mais rápido e provavelmente mais eficiente em termos de memória, isso só é realmente adequado quando não é necessário manter as chaves da matriz.
Se você precisar manter as chaves, o seguinte seria mais adequado;
function insertBefore($input, $index, $newKey, $element){if(!array_key_exists($index, $input)){thrownewException("Index not found");}
$tmpArray = array();foreach($input as $key => $value){if($key === $index){
$tmpArray[$newKey]= $element;}
$tmpArray[$key]= $value;}return $input;}function insertAfter($input, $index, $newKey, $element){if(!array_key_exists($index, $input)){thrownewException("Index not found");}
$tmpArray = array();foreach($input as $key => $value){
$tmpArray[$key]= $value;if($key === $index){
$tmpArray[$newKey]= $element;}}return $tmpArray;}
Isso funciona bem. No entanto, no segundo exemplo, em sua função insertBefore(), você deve retornar em $tmpArrayvez de $input.
Christoph Fischer
4
Com base na ótima resposta do @Halil, aqui está a função simples de como inserir um novo elemento após uma chave específica, preservando as teclas inteiras:
Se você deseja manter as chaves da matriz inicial e também adicionar uma matriz com chaves, use a função abaixo:
function insertArrayAtPosition( $array, $insert, $position ){/*
$array : The initial array i want to modify
$insert : the new array i want to add, eg array('key' => 'value') or array('value')
$position : the position where the new array will be inserted into. Please mind that arrays start at 0
*/return array_slice($array,0, $position, TRUE)+ $insert + array_slice($array, $position, NULL, TRUE);}
Isto é o que funcionou para mim na matriz associativa:
/*
* Inserts a new key/value after the key in the array.
*
* @param $key
* The key to insert after.
* @param $array
* An array to insert in to.
* @param $new_key
* The key to insert.
* @param $new_value
* An value to insert.
*
* @return
* The new array if the key exists, FALSE otherwise.
*
* @see array_insert_before()
*/function array_insert_after($key, array &$array, $new_key, $new_value){if(array_key_exists($key, $array)){
$new = array();foreach($array as $k => $value){
$new[$k]= $value;if($k === $key){
$new[$new_key]= $new_value;}}return $new;}return FALSE;}
A fonte da função - esta postagem no blog . Também há uma função útil para inserir ANTES da chave específica.
Solução por jay.lee é perfeita. Caso você queira adicionar itens a uma matriz multidimensional, primeiro adicione uma matriz dimensional única e, em seguida, substitua-a depois.
Adicionar um item no mesmo formato a essa matriz adicionará todos os novos índices de matriz como itens, em vez de apenas item.
$new = array('title'=>'Time','width'=>10);
array_splice($original,1,0,array('random_string'));// can be more items
$original[1]= $new;// replaced with actual item
Nota: A adição de itens diretamente a uma matriz multidimensional com array_splice adicionará todos os seus índices como itens, em vez de apenas esse item.
Para inserir elementos em uma matriz com chaves de string, você pode fazer algo assim:
/* insert an element after given array key
* $src = array() array to work with
* $ins = array() to insert in key=>array format
* $pos = key that $ins will be inserted after
*/function array_insert_string_keys($src,$ins,$pos){
$counter=1;foreach($src as $key=>$s){if($key==$pos){break;}
$counter++;}
$array_head = array_slice($src,0,$counter);
$array_tail = array_slice($src,$counter);
$src = array_merge($array_head, $ins);
$src = array_merge($src, $array_tail);return($src);}
Respostas:
Você pode achar isso um pouco mais intuitivo. Requer apenas uma chamada de função para
array_splice
:fonte
$inserted
matriz.(array)$scalar
é equivalente aarray($scalar)
, mas para uma matriz, um objeto ou nulo, ela será ignorada (matriz), convertida em uma matriz (objeto) ou se tornará uma matriz vazia (nula) - consulte php.net / manual / pt /…Uma função que pode ser inserida nas posições inteiro e string:
Uso inteiro:
Uso da corda:
fonte
array_splice()
perde as chaves, enquantoarray_merge()
que não. Assim, os resultados da primeira função pode ser muito surpreendente ... Especialmente porque se você tem dois elementos com a mesma chave, apenas o valor do último é mantido ...fonte
+
vez dearray_merge
pode preservar chavesDessa forma, você pode inserir matrizes:
fonte
Não há nenhuma função nativa do PHP (que eu saiba) que possa fazer exatamente o que você solicitou.
Eu escrevi 2 métodos que eu acredito que são adequados para o propósito:
Embora seja mais rápido e provavelmente mais eficiente em termos de memória, isso só é realmente adequado quando não é necessário manter as chaves da matriz.
Se você precisar manter as chaves, o seguinte seria mais adequado;
fonte
insertBefore()
, você deve retornar em$tmpArray
vez de$input
.Com base na ótima resposta do @Halil, aqui está a função simples de como inserir um novo elemento após uma chave específica, preservando as teclas inteiras:
fonte
Se você deseja manter as chaves da matriz inicial e também adicionar uma matriz com chaves, use a função abaixo:
Exemplo de chamada:
fonte
fonte
Isto é o que funcionou para mim na matriz associativa:
A fonte da função - esta postagem no blog . Também há uma função útil para inserir ANTES da chave específica.
fonte
Esta também é uma solução funcional:
créditos vão para: http://binarykitten.com/php/52-php-insert-element-and-shift.html
fonte
Solução por jay.lee é perfeita. Caso você queira adicionar itens a uma matriz multidimensional, primeiro adicione uma matriz dimensional única e, em seguida, substitua-a depois.
Adicionar um item no mesmo formato a essa matriz adicionará todos os novos índices de matriz como itens, em vez de apenas item.
Nota: A adição de itens diretamente a uma matriz multidimensional com array_splice adicionará todos os seus índices como itens, em vez de apenas esse item.
fonte
Você pode usar isso
fonte
Normalmente, com valores escalares:
Para inserir um único elemento de matriz em sua matriz, não se esqueça de agrupar a matriz em uma matriz (pois era um valor escalar!):
caso contrário, todas as teclas da matriz serão adicionadas peça por peça.
fonte
Dica para adicionar um elemento no início de uma matriz :
então:
mas:
fonte
array_unshift($a,'i am the new first element');
se não tiver certeza, NÃO UTILIZE ESTES :
OU
porque com + matriz original será substituído. ( ver fonte )
fonte
Tente este:
fonte
Exemplo de chamada:
fonte
Para inserir elementos em uma matriz com chaves de string, você pode fazer algo assim:
fonte
$src = array_merge($array_head, $ins, $array_tail);
?