なんかちょっとはまったのでメモしておきます。
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が再生成されてしまうので気をつけた方がいいと思います。