2

重複の可能性:
PHP: 「通知: 未定義の変数」および「通知: 未定義のインデックス」

最近エラーが発生し、新しい配列インデックスにインクリメントしている行で未定義のインデックスと未定義のオフセットエラーをキャッチしています。

これは非常に基本的な例です。

for($i = 0; $i<10; $i++)
{
    $arr['var1'] += $val1[$i];
    $arr['var2'] += $val2[$i];
}

最初の反復で $arr['var1'] が設定されていないため、エラーが発生します。

両方ともインデックスが設定されていることを確認していることがわかりました

if (!isset($arr['var1'])) {
    $arr['var1'] = 0;
}
$arr['var1'] += $val1[$i];

• と •</p>

インクリメントするforloopの前に0のvalでインデックスを自動的に設定すると、両方ともエラーメッセージが停止します。

私の質問は、これらのうち約 150 個を修正する必要があるということです。この問題に取り組む最善の方法は何でしょうか。それぞれの isset を確認するか、事前に値 0 でそれぞれを定義しますか?

4

5 に答える 5

3

常に変数を初期化する必要があります。これは事実上すべての言語で絶対的なベスト プラクティスであり、設定されていない変数にアクセスすることは非常に悪い習慣であると考えられています。常にエラーのあるソフトウェアを開発する必要があります。

コードは次のようになります。

$arr['var1'] = $arr['var2'] = 0;
for($i = 0; $i<10; $i++)
{
    $arr['var1'] += $val1[$i];
    $arr['var2'] += $val2[$i];
}

ヒットを取り、この問題の 150 回の発生をすべて修正してから、間違いから学びましょう。次回は正しくコードを書いてください。

于 2012-08-20T15:37:17.210 に答える
1

どちらを選択しても同じ機能が得られるため、これは個人的な好みです。ただし、事前に宣言すると、条件と関数呼び出し (ループ内で繰り返される) を節約できるため、効率の観点から、ループの前に宣言することをお勧めします。通常、ベスト プラクティスは、変数を使用する前に変数を宣言することです。ただし、PHP を使用すると、このようなことを回避できるため、必須ではありません。

于 2012-08-20T15:37:15.773 に答える
1

参照を介してアクセスすると、配列エントリが生成されます (自動有効化)。したがって:

for($i = 0; $i < 10; $i++) {
    $var1 =& $arr['var1'];
    $var2 =& $arr['var2'];
    $var1 += $val1[$i];
    $var2 += $val2[$i];
}

配列自体も宣言する必要はありません。デフォルトでは、新しいエントリの値は NULL になり、追加時に 0 に変換されます。

于 2012-08-20T16:14:35.693 に答える
1

最初に初期化し、次に繰り返します。

$arr['var1'] = 0;
$arr['var2'] = 0;
for($i = 0; $i<10; $i++)
{
    $arr['var1'] += $val1[$i];
    $arr['var2'] += $val2[$i];
}

これははるかに読みやすいコードです。これまで行ってきたことよりも優れた方法です。

多くのカウンターを保持する配列を初期化する必要がある場合は、次のようにすることができます。

$arr = array('counter1' => 0, 'counter2' => 0, 'counter3' => 0);
于 2012-08-20T15:37:36.570 に答える
0

適切なコーディングの練習のために、これらの領域を修正する必要があります。あなたがとるアプローチは、あなたのコードに本当に依存します。本当に新しい変数を使用している場合は、それらを false、0、''、または問題の変数のデフォルトとして意味のあるものとして定義してください。

コード内で値が設定されている場合とされていない場合 ($_POST または $_GET 配列の評価など) は、 を使用するisset()empty()、同様の方法で評価します。

于 2012-08-20T15:39:08.350 に答える