2

次のような PHP コードのスニペットがあります。

  while($attempts < $cycles) {

        foreach($player_array as $player) {
                if(isset($player['results']) && $player['results'] == 1) {
                        $player['results'] = player_search($f, $s, $t);
                }
        }
}

アイデアは、配列内の各項目に対して検索関数を呼び出すことです。検索に何もない場合、false を返します。これは、'results' の値を変更することによって、残りのサイクルの残りの検索を呼び出すことを停止する必要があります。

$player['results']false に設定しても、実際には、次の反復で引き込むときに正しい変数が設定されないと想定しています。

これを正しく機能させるには、コードをどのように変更すればよいですか?

編集:

関数内の検索で結果が返されない場合、その関数を再度呼び出したくないことを明確にできますか?ただし、結果がまだある場合は、同じ関数を他の検索に使用する必要があります。明らかに、すべてのプレーヤーの検索で結果が得られなくなったら、理想的には while ループも中断したいと思います。

4

4 に答える 4

3

と のbreak 2;両方を終了するために使用します。foreachwhile

while($attempts < $cycles) {
    foreach($player_array as $player) {
        if(isset($player['results']) && $player['results'] == 1) {
            $player['results'] = player_search($f, $s, $t);
            break 2;
        }
    }
}

PHP マニュアルの例: http://php.net/manual/en/control-structures.break.php

于 2013-01-24T23:38:54.350 に答える
2

変数を設定しない理由は、結果が 1 または 0 (または true/false) の $player を 1 つだけ設定しているためです。次回のループでは、$player 変数は前回と同じではありません。なぜこのようなことをしないのですか?

while($attempts < $cycles) {
  foreach($player_array as $player) {
    if(isset($player['results']) && $player['results'] == 1) {
      if(!player_search($f, $s, $t)) break;
      else //something here
    }
  }
}

while ループから抜け出したい場合は、いつでも実行できます。break 2;

于 2013-01-24T23:40:06.450 に答える
2

$attempts と $cycles はループ内から変更されていないように見えるため、何が起こっているのかわかりませんが、 $player_array に含まれる $player の値を本当に変更したい場合は、行う必要があります

foreach($player_array as &$player) {
    if(!isset($player['results'])) {
        $player['results'] = player_search($f, $s, $t);
    }
}

コピーではなく参照になるように変更$playerしたことに注意してください&$player

また、結果が結果にまだ保存されていない場合にのみ検索を行うように、isset を変更しました

于 2013-01-24T23:38:48.300 に答える
2

break一致を見つけた (または見つけなかった?) 後に使用します。

while ループも停止するには:break 2;

これが関数内のコードで、他に何もない場合は、結果を返すこともできます。

于 2013-01-24T23:37:33.597 に答える