フリーランス|WEB 制作経験丸7年、制作会社様からのご依頼に丁寧・高クオリティでお手伝いいたします。 IRODORI DESIGN

B L O G

【PHPエラー】Warning: Uninitialized string offsetの解決方法

PHP
Warning: Uninitialized string offset
エラー
トラブルシューティング
プログラミング

PHPでプログラムを作っていると突然表示されるエラー文章。突然エラーが表示されると焦ってしまいますよね。
今回の記事ではPHPエラーの中でもWarning: Uninitialized string offsetについて、原因から実際の具体例、その解決方法まで順を追って詳しく解説したいと思います。

Warning: Uninitialized string offsetとは

まずは実際にWarning: Uninitialized string offsetがどのように表示されるのか見てみましょう。
このエラーは以下の画像のように表示されます。

Warning: Uninitialized string offset: ●● in ▲▲ on line ■■

このエラーが表示される原因は文字列の変数に対して、存在しない文字数のキーを指定した場合に発生するエラーです。

  • ●●・・・存在しない文字数のキー番号
  • ▲▲・・・存在しない文字数のキー番号を指定した「ディレクトリ名/ファイル名」
  • ■■・・・エラーの原因となる処理が書かれている行数

つまり、「▲▲ファイルの■■行目に存在しない文字数のキー番号が指定されている個所があるよ」ということを教えてくれています。

なお、PHPバージョンによってはNotice: Uninitialized string offsetと表示されますが、どちらも同じエラー内容となります。

Warning: Uninitialized string offsetが起こる具体例

”文字列の変数に対して、存在しない文字数のキーを指定している”と書きましたが、具体的にどういうことなのか、実際にこのWarning: Uninitialized string offsetが発生するコードを交えてご紹介します。

<?php

$text = 'Warning: Uninitialized string offset';
echo $text[100];

?>

$textは全部で空白を含めて36文字、つまりキーとして指定できるのは$text[34]までとなります。
そのため、存在しない文字数のキー番号が指定するとWarning: Uninitialized string offsetが表示されます。

Warning: Uninitialized string offsetの解決方法

存在しない文字数のキー番号を指定している為、エラーが起こるとご紹介しました。そのため、存在している文字数のキー番号を指定するようにコードを書き換えることでエラーは解消します。

【例1】半角文字の場合

半角文字の場合は文字を先頭から数えて取り出したい文字の番号を指定しましょう。
ただし、この際注意したいのは1文字目は「0」からカウントするということです。
1文字目なら、$text[0]、10文字目なら$text[9]というようにキー番号を指定します。

<?php

$text = 'Warning: Uninitialized string offset';
echo $text[2];

?>

存在している文字数のキー番号を指定することで、エラーを回避し文字を出力することが出来ます。

【例2】全角文字を含む場合

続いては全角文字を含む文字列の場合で、この場合は注意が必要です。先ほど文字数とお伝えしましたが、それは半角文字だけの場合に限ります。
全角文字を含む場合は、バイト数を考慮する必要があります。全角文字は1文字で2バイト、つまり1文字でキー番号2つ分使用するということになります。
また、全角文字に関しては、$text[48]の方法で文字を表示しようとすると文字化けしてしまい表示することは出来ません。

それでは全角文字を表示する場合はどうするかというと、以下のように文字列を配列化してからキー番号を指定して出力します。

<?php

$text = 'Warning: Uninitialized string offsetの解決方法';
$text = mb_str_split($text);
echo $text[39];

// var_dump( $text );
// array(40) { [0]=> string(1) "N" [1]=> string(1) "o" [2]=> string(1) "t" [3]=> string(1) "i" [4]=> string(1) "c" [5]=> string(1) "e" [6]=> string(1) ":" [7]=> string(1) " " [8]=> string(1) "U" [9]=> string(1) "n" [10]=> string(1) "i" [11]=> string(1) "n" [12]=> string(1) "i" [13]=> string(1) "t" [14]=> string(1) "i" [15]=> string(1) "a" [16]=> string(1) "l" [17]=> string(1) "i" [18]=> string(1) "z" [19]=> string(1) "e" [20]=> string(1) "d" [21]=> string(1) " " [22]=> string(1) "s" [23]=> string(1) "t" [24]=> string(1) "r" [25]=> string(1) "i" [26]=> string(1) "n" [27]=> string(1) "g" [28]=> string(1) " " [29]=> string(1) "o" [30]=> string(1) "f" [31]=> string(1) "f" [32]=> string(1) "s" [33]=> string(1) "e" [34]=> string(1) "t" [35]=> string(3) "の" [36]=> string(3) "解" [37]=> string(3) "決" [38]=> string(3) "方" [39]=> string(3) "法" }

?>

このように文字列を配列化することで全角文字もキー番号を指定して出力することが出来ました。
ただし、このmb_str_split()関数はPHP7.4.0以降のバージョンから使用することが出来ます。

まとめ

いかがでしたか?
プログラミングをしていると思わぬエラーに出くわすことがただあります。
そんな時はブラウザに表示されるエラー内容をよく確認し、エラーを解消しましょう。