PHP:インデックスを再作成する代わりに、キーを保持しながら2つの配列をマージしますか?


255

文字列/整数キーを保持しながら、2つの配列(1つは文字列=>値のペア、もう1つはint =>値のペア)をマージするにはどうすればよいですか?それらのいずれも重複することはありません(一方が文字列のみを持ち、もう一方が整数しか持たないため)。

これが私の現在のコードです(array_mergeが整数キーで配列のインデックスを再作成しているため、機能しません):

// get all id vars by combining the static and dynamic
$staticIdentifications = array(
 Users::userID => "USERID",
 Users::username => "USERNAME"
);
// get the dynamic vars, formatted: varID => varName
$companyVarIdentifications = CompanyVars::getIdentificationVarsFriendly($_SESSION['companyID']);
// merge the static and dynamic vars (*** BUT KEEP THE INT INDICES ***)
$idVars = array_merge($staticIdentifications, $companyVarIdentifications);

1
これは奇妙です。PHPのドキュメントページによると、array_merge はそれを行うべきではありません。文字列キーは実際には整数の文字列表現ですか?
オーウェンマーシャル2010

array_mergeが2番目の配列のインデックスを再作成しています。すなわち。それは配列をarray( 123 => "VALUE123" )に変更していますarray( 0 => "VALUE123" )
Garrett

うーん、それは面白いです。その点では、PHPのドキュメントが少し不明確になる可能性があります。それは場合はどうなるのかと言うすべての配列のテンキーを持っているが、特にそうでない場合はどうなるか言っていません。
Steven Oxley、2010

多分2年前ではない。しかし、2012年には、この点に関してドキュメントは非常に明確です。
cartbeforehorse

実際、ドキュメントはまだ明確ではありません。「数値」には、実際にはすべて数字の文字列が含まれます(PHP 5.3.3)。 assert(array(0=>0,1=>1) === array_merge(array('9'=>0), array('9'=>1)))
ボブ・スタイン

回答:


557

単純に配列を「追加」できます。

>> $a = array(1, 2, 3);
array (
  0 => 1,
  1 => 2,
  2 => 3,
)
>> $b = array("a" => 1, "b" => 2, "c" => 3)
array (
  'a' => 1,
  'b' => 2,
  'c' => 3,
)
>> $a + $b
array (
  0 => 1,
  1 => 2,
  2 => 3,
  'a' => 1,
  'b' => 2,
  'c' => 3,
)

44
これには非常に注意してください。+演算子は加算ではなく、和集合です。キーが重ならない場合はすべて問題ありませんが、重なる場合は...
GordonM

3
ちょうどすごい-あなたは私にコード行のバケットを保存しました、ほぼ3年後。
Stephen O'Flynn 2013

86
誰かが「重複しているとしたらどうしますか?」:php.net: "+演算子は、左側の配列に追加された右側の配列を返します。両方の配列に存在するキーの場合、左側の配列の要素が使用され、右側の一致する要素が使用されますハンド配列は無視されます。」
Flion 2013

2
@Flionはそれよりも複雑です。'+'を使用して、共通のキーとサブキーを持つ要素を持つ2つのサブ配列を追加しました。値が追加されました!100000 =>配列(size = 3)1 => int 128 2 => int 56 3 => int 7 + 100000 =>配列(size = 1)2 => int 30結果:100000 =>配列(size = 3) 1 => int 128 2 => int 86 3 => int 7基本的に[2 => 56] + [2 => 30]を追加しても値は置き換えられず、追加されて[2 => 86]になった
Dario Fumagalli

1
@DarioFumagalli誤解しているのか、2016年以降変更されたばかりなのかはわかりませんが、現時点では、操作はprint_r([2 => 56] + [2 => 30]);生成されArray ( [2] => 56 )ます。したがって、指定されたとおりに左側を維持しています。これは、PHP 7.1.19の時点で、repl.itで実行されています
Charles Wood

62

あなたが持っていることを考慮して

$replaced = array('1' => 'value1', '4' => 'value4');
$replacement = array('4' => 'value2', '6' => 'value3');

実行$merge = $replacement + $replaced;すると出力されます:

Array('4' => 'value2', '6' => 'value3', '1' => 'value1');

sumの最初の配列は、最終出力に値を持ちます。

実行$merge = $replaced + $replacement;すると出力されます:

Array('1' => 'value1', '4' => 'value4', '6' => 'value3');

[[thumbsup]]これについて
Jhourlad Estrella 2013

21
要約すると、2つの配列を追加すると、最初の値が2番目の値を上書きします。
Dziamid 2013年

1
2つ目は1つ目をオーバーライドすると思いました。:)
Asim KT

1
丁度。そのため、を使用できませんでした$allValues += $newValues;
MarthyM 2017年

やって$merge = $replacement + $replaced;意志の出力を:Array ( [4] => value2 [6] => value3 [1] => value1 )
チャンダンシャルマ

24

この質問はかなり古いものですが、キーを保持しながらマージを実行する可能性を追加したいだけです。

+記号を使用して既存の配列にキー/値を追加する以外に、を実行できますarray_replace

$a = array('foo' => 'bar', 'some' => 'string');
$b = array(42 => 'answer to the life and everything', 1337 => 'leet');

$merged = array_replace($a, $b);

結果は次のようになります。

Array
(
  [foo] => bar
  [some] => string
  [42] => answer to the life and everything
  [1337] => leet
)

同じキーが後者の配列によって上書きされます。サブアレイに対してこれを行う
も存在しarray_replace_recursiveます。

3v4l.orgの実例


3

+演算子で元のインデックスを変更せずに、2つの配列を簡単に追加または結合できます。これは、laravelとcodeigniterの選択ドロップダウンで完全に役立ちます。

 $empty_option = array(
         ''=>'Select Option'
          );

 $option_list = array(
          1=>'Red',
          2=>'White',
          3=>'Green',
         );

  $arr_option = $empty_option + $option_list;

出力は次のようになります:

$arr_option = array(
   ''=>'Select Option'
   1=>'Red',
   2=>'White',
   3=>'Green',
 );

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.