Featured image of post array_mergeでのトラブル

array_mergeでのトラブル

Twitter ツイート Hatena Bookmark ブックマーク

なんかちょっとはまったのでメモしておきます。
PHPって配列がフリーダムな感じでとってもいい感じの言語だったりするわけです。
んで、良くやるのがユーザーIDとか一意なキーを配列のindexにしてあげるってやつね。
便利ですよね。例えばこんな感じの配列

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$a = array(
  1 => array(
    'name' => 'poli01',
    'point' => 200,
  ),  
  2 => array(
    'name' => 'polid02',
    'point' => 1000,
  ),  
  3 => array(
    'name' => 'poli03',
    'point' => 10,
  ),  
);

$b = array(
  100 => array(
    'name' => 'poli100',
    'point' => 1000000,
  ),  
);

そんないい感じの配列同士をマージしたいときって多々あると思います。
この$aと$bを単純にくっつけたい場合に、array_mergeとかつかうと実はこんな実行結果になります。

1
2
<?php
var_dump(array_merge($a,$b));

実行結果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
% php test.php
array(4) {
  [0]=>
  array(2) {
    ["name"]=>
    string(6) "poli01"
    ["point"]=>
    int(200)
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(7) "polid02"
    ["point"]=>
    int(1000)
  }
  [2]=>
  array(2) {
    ["name"]=>
    string(6) "poli03"
    ["point"]=>
    int(10)
  }
  [3]=>
  array(2) {
    ["name"]=>
    string(7) "poli100"
    ["point"]=>
    int(1000000)
  }
}

見ての通りですが、配列のindexは再生成されて0~3までとしてindexが生成されていますね。
これでは使い勝手が非常にわるい…
ちなみにcakePHPのSet::marge()メソッドでも同じような現象はおきます。。。

まあ単純にループさせればいいじゃないかと突っ込まれたらそれまでなんですが、以下のように配列同士を加算してあげれば解決できますね。

1
2
$a += $b;
var_dump($a);

実行結果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
% php test.php
array(4) {
  [1]=>
  array(2) {
    ["name"]=>
    string(6) "poli01"
    ["point"]=>
    int(200)
  }
  [2]=>
  array(2) {
    ["name"]=>
    string(7) "polid02"
    ["point"]=>
    int(1000)
  }
  [3]=>
  array(2) {
    ["name"]=>
    string(6) "poli03"
    ["point"]=>
    int(10)
  }
  [100]=>
  array(2) {
    ["name"]=>
    string(7) "poli100"
    ["point"]=>
    int(1000000)
  }
}

これで配列のIndex崩れずにマージができましたね(・∀・)!

ちなみにarray_unshiftとかarray_shiftだっけかな、あれでもindexが再生成されてしまうので気をつけた方がいいと思います。

comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。