0

このような配列に +1 を単純に追加しようとしています

$game['teamA']['goals']++;

しかし、その後、未定義のインデックスに関するエラーがスローされます。$game['teamA']['goals']これは、値を追加する前に が設定されていないためだと思います。

しかし、これを回避する方法はありませんか?

シミュレーションの開始時に設定することもできます$game['teamA']['goals'] = 0が、その後、フリーキック、ペナルティ、カードなどでそれを行う必要があり、両方のチームに対して行う必要があります。これを行う別の方法はありませんか?

前もって感謝します :)

4

4 に答える 4

2

あなたが提案したように、「適切な初期化」を行うことをお勧めします。それはあなたのプログラムのコードになりますが、更新ごとにチェックするよりも常に良いです。したほうがいい

$game = array( 'teamA' => array('goals'       => 0,
                                'freekicks'   => 0,
                                'penalties'   => 0,
                                // etc ...                       
                          ),
               'teamB' => array('goals'       => 0,
                                'freekicks'   => 0,
                                'penalties'   => 0,
                                // etc ...
                          )
        );  

それ以外の

if(isset($game['teamA']['goals']))
    $game['teamA']['goals']++;
else
    $game[teamA]['goals'] = 1;

変数を適切に初期化することは何も悪いことではありません - それらすべてです。そうすることもお勧めです。

于 2012-10-13T13:01:05.167 に答える
2

変数は、使用する前に必ず初期化する必要があります。これを行う1つの方法は次のとおりです。

$game = array('teamA' => 
                  array(
                      'goals' => 0,
                      'freekicks' => 0,
                      'penalties' => 0,
                      ....
                  ),
              'teamB' =>
                  array(
                      'goals' => 0,
                      'freekicks' => 0,
                      'penalties' => 0,
                      ...
                  )
              );
于 2012-10-13T13:01:25.633 に答える
1

値を設定するラッパー関数を記述します。

<?php

function increment(&$dict, $key1, $key2) {
  if (!isset($dict, $key1))
    $dict[$key1] = array();
  if (!isset($dict[$key1], $key2))
    $dict[$key1][$key2] = 1;
  else
    $dict[$key1][$key2] ++;
}

$game= array();
increment($game, "teamA", "goals");
var_dump( $game);
?>

それは、実行時に何を期待するかに大きく依存します。これらの操作が頻繁に呼び出される場合は、 https://stackoverflow.com/a/12873359/1689451が提案するように、他のことを行う前にすべての配列インデックスを作成することをお勧めします。

于 2012-10-13T13:08:01.133 に答える
0

できることは 1 つです。インクリメントする前に、配列の存在を確認し、存在しない場合は作成してください! それと同じくらい簡単です。isset()変数の存在をチェックする組み込み関数 を使用できます。

短い方法:

(isset($game['teamA']['goals']) ? $game['teamA']['goals']++ : $game['teamA']['goals'] = 1;

またはif条件を使用して:

if (isset($game['teamA']['goals'])
    $game['teamA']['goals']++;
else
    $game['teamA']['goals'] = 1;
于 2012-10-13T12:59:01.123 に答える