web-dev-qa-db-ja.com

PHPある配列を別の配列に追加します(array_Pushや+ではありません)

キーを比較せずに、ある配列を別の配列に追加する方法

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

Array( [0]=>a [1]=>b [2]=>c [3]=>d )私が[]array_Pushのようなものを使うと、それはこれらの結果の1つを引き起こすでしょう:

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

それは、何かをするべきです、これをするが、もっとエレガントな方法で。

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

array_merge はエレガントな方法です。

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

次のようなことをします。

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

+演算子は実際にはそれらをマージしないため、機能しません。それらが$a$bと同じキーを持っているなら、それは何もしません。

364
netcoder

PHP 5.6以降でこれを行う別の方法は、...トークンを使用することです。

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

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

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

これはどんな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');

警告ですが、これは配列$bが空の場合に致命的エラーを引き起こします。

48
bstoney

なぜ使わないの?

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

これを正しい組み込みメソッドとして使いたくないのです。

30
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));
?>

出力:

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
)

参照元コード

15

これはかなり古い投稿ですが、ある配列を別の配列に追加することについて何か追加したいと思います。

もし

  • 片方または両方の配列に連想キーがあります
  • 両方の配列のキーは関係ありません

あなたはこのような配列関数を使うことができます:

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

array_mergeは数値キーをマージしないので、$ appendArrayのすべての値を追加します。 foreachループの代わりにネイティブのphp関数を使用しながら、それは多くの要素を持つ配列の方が速いはずです。

13
SenseException

大きな配列の場合、メモリのコピーを避けるため、array_mergeなしで連結することをお勧めします。

$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

BstoneyとSnarkによる回答から続けて、さまざまな方法でいくつかテストを行いました。

$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);

どれが生成されます:

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

私はPHP 7の時点で、方法3が foreachループが作用する という意味で、非常に優れた選択肢であると信じています。反復されている配列のコピーを作成します。

方法3は厳密には質問の 'not array_Push'の基準に対する答えではありませんが、1行であり、あらゆる点で最も高性能です。..構文が選択肢になる前に質問が行われたと思います。

8
Jamie Robinson

PHP 7より前のバージョンでは、

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

array_splice()は配列(第1引数)を参照して動作し、第2引数と第3引数の数から始まる値のリストの代わりに配列(第4引数)の値を置きます。 2番目の引数をソース配列の終わり、3番目の引数をゼロに設定すると、4番目の引数値が1番目の引数に追加されます。

1
tutankhamun

空の配列を既存の新しい値とマージしたい場合。最初に初期化する必要があります。

$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

その助けを願っています。

0
drosanda

foreachループは、既存の配列に値を追加するためにarray_mergeよりも高速です。したがって、別の配列の末尾に配列を追加する場合は、代わりにループを選択してください。

// 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