COMPANY SERVICE STAFF BLOG NEWS CONTACT

STAFF BLOG

スタッフブログ

TECHNICAL

テクログ

2024.01.17

array_keys、array_mergeの罠

テクログphp

どうも、お久しぶりです。

罠というほどでもないのですが、array_keysの考慮もれが原因でスロークエリが発生するケースが

あったのでそれを今回は書こうと思います。

それと似た問題で array_mergeの罠(これは罠といっていいんじゃないか)についても書こうと思います。

array_keysについて

$data['572946503859']  = [
    'title' => 'タイトル',
    'body'  => '本文'
    ];

$data['avoajsunwosim'] = [
    'title' => 'タイトル',
    'body'  => '本文'
    ];
    
$keys = array_keys($data);

var_dump($keys);

簡単なサンプルで説明します。上記のようなデータがあるとします。

「572946503859」「avoajsunwosim」はDBのレコードを識別するユニークなものと考えていただけますと。

また、これを保存しているカラムは INDEXの効いた VARCHAR で実装してるものとします。

この時、array_keysの結果が入った $keys は以下のようになります。

array(2) {
  [0]=>
  int(572946503859)
  [1]=>
  string(13) "avoajsunwosim"
}

ここで注意なのが「572946503859」の方がintで格納されるということです。

これをもとに以下のようなSQLを発火してしまうと(hoge_hogeというカラムはVARCHAR想定です)

hoge_hogeというカラムに実装しているINDEXが効かず、テーブルのフルスキャンが走ります。

SELECT *
FROM blog_details
WHERE hoge_hoge IN (572946503859, 'avoajsunwosim');

blog_detailsというテーブルに大量のデータが入っていると、RDSのCPU使用率が高騰する原因に繋がるので

気をつけたいという話でした。

array_mergeについて

$data1 = [
    '111' => '',
    'aaa' => '',
    ];
    
$data2 = [
    '222' => '',
    'bbb' => '',
    ];
    
$data = array_merge($data1, $data2);

var_dump($data);

上記のようなデータがあるとします。

2つの配列をarray_mergeした結果はどうなるでしょうか?

感覚的には「111」「aaa」「222」「bbb」の4つのキーを持った1次元配列を持つんじゃないか?と考えそうです。

ですが結果は以下です。

array(4) {
  [0]=>
  string(0) ""
  ["aaa"]=>
  string(0) ""
  [1]=>
  string(0) ""
  ["bbb"]=>
  string(0) ""
}

え、「111」「222」どこいったん … って感じですよね。

array_mergeは数値インデックスを0から再度振り直す仕様なので、

これを気をつけておかないと結構危険です。

ちなみに、array_mergeではなく、+ を使えば「111」などが消えることは無いです。

$data = $data1 + $data2;

以上となります。

この記事を書いた人

たかし

入社年2020年

出身地和歌山

業務内容WEB制作

特技・趣味YouTubeみること

テクログに関する記事一覧

TOP