array_mergeでのトラブル

March 23, 2012,
tags: array_merge php


このエントリーをはてなブックマークに追加

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

<?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とかつかうと実はこんな実行結果になります。

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

実行結果

% 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()メソッドでも同じような現象はおきます。。。

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

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

実行結果

% 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