web-dev-qa-db-ja.com

PHP注意:未定義のオフセット:データの読み取り時の配列の1

このPHPエラーが発生しています:

PHP Notice:  Undefined offset: 1

以下は、それをスローするPHPコードです。

$file_handle = fopen($path."/Summary/data.txt","r"); //open text file
$data = array(); // create new array map

while (!feof($file_handle) ) {
    $line_of_text = fgets($file_handle); // read in each line
    $parts = array_map('trim', explode(':', $line_of_text, 2)); 
    // separates line_of_text by ':' trim strings for extra space
    $data[$parts[0]] = $parts[1]; 
    // map the resulting parts into array 
    //$results('NAME_BEFORE_:') = VALUE_AFTER_:
}

このエラーはどういう意味ですか?このエラーの原因は何ですか?

57
alchuang

変化する

$data[$parts[0]] = $parts[1];

if ( ! isset($parts[1])) {
   $parts[1] = null;
}

$data[$parts[0]] = $parts[1];

または単に:

$data[$parts[0]] = isset($parts[1]) ? $parts[1] : null;

ファイルのすべての行にコロンが含まれているわけではないため、爆発するとサイズ1の配列が返されます。

php.netによるexplode からの可能な戻り値によると:

区切り文字によって形成された境界で文字列パラメーターを分割することによって作成された文字列の配列を返します。

Delimiterが空の文字列( "")の場合、explode()はFALSEを返します。区切り文字に文字列に含まれない値が含まれ、負の制限が使用される場合、空の配列が返されます。それ以外の場合、文字列を含む配列が返されます。

105
GGio

PHPで上記のエラーを再現する方法:

php> $yarr = array(3 => 'c', 4 => 'd');

php> echo $yarr[4];
d

php> echo $yarr[1];
PHP Notice:  Undefined offset: 1 in 
/usr/local/lib/python2.7/dist-packages/phpsh/phpsh.php(578) : 
eval()'d code on line 1

そのエラーメッセージはどういう意味ですか?

これは、PHPコンパイラがキー1を探し、それに対してハッシュを実行し、それに関連付けられた値が見つからなかったため、Undefined offset: 1が言ったことを意味します

エラーを解消するにはどうすればよいですか?

次のように値を返す前に、キーが存在するかどうかを配列に問い合わせます。

php> echo array_key_exists(1, $yarr);

php> echo array_key_exists(4, $yarr);
1

配列にキーが含まれていない場合、その値を要求しないでください。このソリューションでは、プログラムが「存在するかどうかを確認」してから「入手」するという二重の作業を行います。

より高速な代替ソリューション:

不足しているキーを取得することがエラーによって引き起こされる例外的な状況である場合は、(echo $yarr[1];のように)値を取得し、そのオフセットエラーをキャッチして次のように処理する方が高速です: https://stackoverflow.com/ a/5373824/445131

19
Eric Leschinski

これは「PHP通知」なので、理論的には無視できます。 php.iniを変更します。

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED

error_reporting = E_ALL & ~E_NOTICE

これは、通知を除くすべてのエラーを表示します。

1
Orijmm

私は最近この問題を抱えていましたが、それが私のミスタイプだとは信じていませんでした:

Array("Semester has been set as active!", true)
Array("Failed to set semester as active!". false)

そして実際にそうでした!誤って「」ではなく「」と入力しただけです...

0
Erikas

ファイル内のPHP警告を非表示

error_reporting(0);
0
Vitalicus

私の最速の解決策は、配列の長さをマイナス1にすることでした

  $len = count($data);

    for($i=1; $i<=$len-1;$i++){
      echo $data[$i];
    }

カウントが140の場合、私のオフセットは常に最後の値でしたが、offset 140と表示されますが、マイナス1を使用した後はすべてうまくいきました

理想的な解決策は次のとおりです。 0からnまでの値を見逃すことはありません。

$len=count($data); for($i=0;$i<$len;$i++) echo $data[$i]. "<br>";
0
Sashi Giri