PHP 配列を初期化しながらセットすると Undefined offset になる事例

カテゴリ: PHP

記事投稿日: 2016年10月15日



PHP x Phalcon で遭遇した事例です。
Postgres のストアドクロシージャの処理をPHPに移植する案件ではまりました。

こんな環境も珍しいでしょうが…。

配列を初期化したあと、指定した回数回して、自分自身に値を加算していきます。

$can = [];
$tel = [];
$shop = [];

foreach ($result as $key => $val) {
    for ($i = 0; $i < 48; $i++) {
        $can[$i] = $can[$i] +$val[$i];
        $tel[$i] = $can[$i] +$val[$i];
        $shop[$i] = $shop[$i] +$val[$i];
    }
}

すると、Notice: Undefined offset: 0(インデックスの数) と出力されます。

Postgres のストアドでは、上のような書き方になって動いていたのですが、
PHPで動かすと、インデックスがまるでききません。

つまり、「まだ値が確定していない配列に対し、キーで参照するのはおかしい」ということですね。

解決策は、事前にインデックスをちゃんとセットすることです。

for ($cnt = 0; $cnt < 48; $cnt++) {
    $can[] = '';
    $tel[] = '';
    $shop[] = '';
}

この後、加算処理を入れれば動きます。

PHPで最初から書けばこんなことにならないと思いますが、
他人の書いたコードを適用したり、多言語から移植とかイレギュラーなことをしたら遭遇するかもです。
怪しいコードは、1行ずつテスト、ですね。
参考になりましたら幸いです。
以上です。








コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA




トップに戻る