web-dev-qa-db-fra.com

PHP ajoute un tableau à un autre (pas array_Push ou +)

Comment ajouter un tableau à un autre sans comparer leurs clés?

$a = array( 'a', 'b' );
$b = array( 'c', 'd' );

À la fin, cela devrait être: Array( [0]=>a [1]=>b [2]=>c [3]=>d ) Si j'utilise quelque chose comme [] ou array_Push, cela provoquera l'un des résultats suivants:

Array( [0]=>a [1]=>b [2]=>Array( [0]=>c [1]=>d ) )
//or
Array( [0]=>c [1]=>d )

Cela devrait juste être quelque chose, faire cela, mais d'une manière plus élégante:

foreach ( $b AS $var )
    $a[] = $var;
237
Danil K

array_merge est la manière élégante:

_$a = array('a', 'b');
$b = array('c', 'd');
$merge = array_merge($a, $b); 
// $merge is now equals to array('a','b','c','d');
_

Faire quelque chose comme:

_$merge = $a + $b;
// $merge now equals array('a','b')
_

Ne fonctionnera pas car l'opérateur _+_ ne les fusionne pas réellement. S'ils _$a_ a les mêmes clés que _$b_, cela ne fera rien.

375
netcoder

Une autre façon de faire ceci dans PHP 5.6+ serait d'utiliser le jeton ...

$a = array('a', 'b');
$b = array('c', 'd');

array_Push($a, ...$b);

// $a is now equals to array('a','b','c','d');

Cela fonctionnera également avec tout Traversable

$a = array('a', 'b');
$b = new ArrayIterator(array('c', 'd'));

array_Push($a, ...$b);

// $a is now equals to array('a','b','c','d');

Un avertissement cependant, cela provoquera une erreur fatale si le tableau $b est vide

53
bstoney

Pourquoi ne pas utiliser

$appended = array_merge($a,$b); 

Pourquoi ne voulez-vous pas utiliser cette méthode intégrée correcte?.

32
Mark Baker
<?php
// Example 1 [Merging associative arrays. When two or more arrays have same key
// then the last array key value overrides the others one]

$array1 = array("a" => "Java", "b" => "ASP");
$array2 = array("c" => "C", "b" => "PHP");
echo " <br> Example 1 Output: <br>";
print_r(array_merge($array1,$array2));

// Example 2 [When you want to merge arrays having integer keys and
//want to reset integer keys to start from 0 then use array_merge() function]

$array3 =array(5 => "CSS",6 => "CSS3");
$array4 =array(8 => "JAVASCRIPT",9 => "HTML");
echo " <br> Example 2 Output: <br>";
print_r(array_merge($array3,$array4));

// Example 3 [When you want to merge arrays having integer keys and
// want to retain integer keys as it is then use PLUS (+) operator to merge arrays]

$array5 =array(5 => "CSS",6 => "CSS3");
$array6 =array(8 => "JAVASCRIPT",9 => "HTML");
echo " <br> Example 3 Output: <br>";
print_r($array5+$array6);

// Example 4 [When single array pass to array_merge having integer keys
// then the array return by array_merge have integer keys starting from 0]

$array7 =array(3 => "CSS",4 => "CSS3");
echo " <br> Example 4 Output: <br>";
print_r(array_merge($array7));
?>

Sortie:

Example 1 Output:
Array
(
[a] => Java
[b] => PHP
[c] => C
)

Example 2 Output:
Array
(
[0] => CSS
[1] => CSS3
[2] => JAVASCRIPT
[3] => HTML
)

Example 3 Output:
Array
(
[5] => CSS
[6] => CSS3
[8] => JAVASCRIPT
[9] => HTML
)

Example 4 Output:
Array
(
[0] => CSS
[1] => CSS3
)

Code de source de référence

15
Hassan Amir Khan

C'est un très vieux billet, mais je veux ajouter quelque chose à propos de l'ajout d'un tableau à un autre:

Si

  • un ou les deux tableaux ont des clés associatives
  • les clés des deux tableaux n'ont pas d'importance

vous pouvez utiliser des fonctions de tableau comme ceci:

array_merge(array_values($array), array_values($appendArray));

array_merge ne fusionne pas les clés numériques, il ajoute donc toutes les valeurs de $ appendArray. Si vous utilisez des fonctions php natives au lieu d’une boucle foreach, cela devrait être plus rapide sur les tableaux contenant beaucoup d’éléments.

14
SenseException

Pour un grand tableau, il est préférable de concaténer sans array_merge, pour éviter une copie en mémoire.

$array1 = array_fill(0,50000,'aa');
$array2 = array_fill(0,100,'bb');

// Test 1 (array_merge)
$start = microtime(true);
$r1 = array_merge($array1, $array2);
echo sprintf("Test 1: %.06f\n", microtime(true) - $start);

// Test2 (avoid copy)
$start = microtime(true);
foreach ($array2 as $v) {
    $array1[] = $v;
}
echo sprintf("Test 2: %.06f\n", microtime(true) - $start);


// Test 1: 0.004963
// Test 2: 0.000038
9
Snark

Suite aux réponses de bstoney et Snark, j’ai fait quelques tests sur les différentes méthodes:

$array1 = array_fill(0,50000,'aa');
$array2 = array_fill(0,50000,'bb');

// Test 1 (array_merge)
$start = microtime(true);
$array1 = array_merge($array1, $array2);
echo sprintf("Test 1: %.06f\n", microtime(true) - $start);

// Test2 (foreach)
$start = microtime(true);
foreach ($array2 as $v) {
    $array1[] = $v;
}
echo sprintf("Test 2: %.06f\n", microtime(true) - $start);

// Test 3 (... token)
// PHP 5.6+ and produces error if $array2 is empty
$start = microtime(true);
array_Push($array1, ...$array2);
echo sprintf("Test 3: %.06f\n", microtime(true) - $start);

Qui produit:

Test 1: 0.008392 
Test 2: 0.004626 
Test 3: 0.003574

Je crois qu'à partir de PHP 7, la méthode 3 est une alternative bien meilleure en raison de la façon dont les boucles foreach agissent maintenant , qui consiste à faire une copie du tableau sur lequel on effectue une itération.

Bien que la méthode 3 ne réponde pas strictement aux critères de 'not array_Push' dans la question, il s'agit d'une ligne et de la plus haute performance à tous égards, je pense que la question a été posée avant que la syntaxe ... ne soit une option.

8
Jamie Robinson

Avant PHP7, vous pouvez utiliser:

array_splice($a, count($a), 0, $b);

array_splice() fonctionne avec une référence au tableau (1er argument) et met les valeurs du tableau (4ème argument) à la place de la liste des valeurs démarrant à partir du 2ème argument et le nombre du 3ème argument. Lorsque nous définissons le 2ème argument comme fin du tableau source et le 3ème comme zéro, nous ajoutons les valeurs du 4ème argument au 1er argument.

1
tutankhamun

si vous voulez fusionner un tableau vide avec une nouvelle valeur existante. Vous devez d'abord l'initialiser.

$products = array();
//just example
for($brand_id=1;$brand_id<=3;$brand_id++){
  array_merge($products,getByBrand($brand_id));
}
// it will create empty array
print_r($a);

//check if array of products is empty
for($brand_id=1;$brand_id<=3;$brand_id++){
  if(empty($products)){
    $products = getByBrand($brand_id);
  }else{
    array_merge($products,getByBrand($brand_id));
  }
}
// it will create array of products

J'espère son aide.

0
drosanda

la boucle foreach est plus rapide que array_merge pour ajouter des valeurs à un tableau existant. Choisissez donc la boucle si vous souhaitez ajouter un tableau à la fin d'un autre.

// Create an array of arrays
$chars = [];
for ($i = 0; $i < 15000; $i++) {
    $chars[] = array_fill(0, 10, 'a');
}

// test array_merge
$new = [];
$start = microtime(TRUE);
foreach ($chars as $splitArray) {
    $new = array_merge($new, $splitArray);
}
echo microtime(true) - $start; // => 14.61776 sec

// test foreach
$new = [];
$start = microtime(TRUE);
foreach ($chars as $splitArray) {
    foreach ($splitArray as $value) {
        $new[] = $value;
    }
}
echo microtime(true) - $start; // => 0.00900101 sec
// ==> 1600 times faster
0
user3226852