注: 私はこれが受け入れられるコードではないことを認識しています。同じ結果を達成するための他の方法についてのアドバイスではなく、インタプリタが何をしているかを理解しようとしています!
それ以来、|,|| を使用することはできませんし、使用するべきではないことを理解するのに十分な量を読みました。または、switch ケースを定義する際の XOR です。つまり、「そんなことはしないでください」という趣旨のコメントはしないでください。私は、インタープリターがそのようなステートメントで何をしているのかを理解し、動作の奇妙さを理解しようとしているだけです。PHP 5.3.1 を使用しています。
これは私が実際にやろうとしていたことであり、現在使用しています。コードを推奨しないでください:
for ($i=0; $i<count($this->header); $i++) {
switch($i) {
case 0:
$this->header[ $i ] = $this->header[ $i ] ? $this->header[ $i ] : -5; //angle from goal
break;
case 1:
$this->header[$i] = $this->header[$i] ? $this->header[$i] : -5; //miss penalty
break;
case 2:
$this->header[$i] = $this->header[$i] ? $this->header[$i] : -10; //miss penalty
break;
case 3:
$this->header[ $i ] = $this->header[ $i ] ? $this->header[ $i ] : -10; //error penalty
break;
}
}
しかし、私ができるかどうか興味がありました:
for ($i=0; $i<count($this->header); $i++) {
switch($i) {
case 0 || 1:
$this->header[ $i ] = $this->header[ $i ] ? $this->header[ $i ] : 15; //angle from goal
break;
case 2 || 3:
$this->header[$i] = $this->header[$i] ? $this->header[$i] : -5; //miss penalty
break;
}
}
そして、逆に、これは実行されますが、非常に遅く (数秒程度)、もちろん、(0||1)
私が意図したとおりには評価されません (実際、今日はビットごとの演算子と論理演算子の違いに関するレッスンでした)。
しかし、私にとってもっと興味深かったのは、非常にゆっくりと、私が望んでいた結果ではなかったとしても、これを行うことができるという事実でした:
for ($i=0; $i<count($this->header); $i++) {
switch($i) {
case 0 XOR 1:
$this->header[ $i ] = $this->header[ $i ] ? $this->header[ $i ] : 15; //angle from goal
break;
case 2:
$this->header[$i] = $this->header[$i] ? $this->header[$i] : -5; //miss penalty
break;
case 3:
$this->header[$i] = $this->header[$i] ? $this->header[$i] : -5; //miss penalty
break;
}
}
しかし、私はこれを行うことができませんでした:
for ($i=0; $i<count($this->header); $i++) {
switch($i) {
case 0 XOR 1:
$this->header[ $i ] = $this->header[ $i ] ? $this->header[ $i ] : 15; //angle from goal
break;
case 2 XOR 3:
$this->header[$i] = $this->header[$i] ? $this->header[$i] : -5; //miss penalty
break;
}
}
これは、PHP が評価さえしない、これらの恐ろしい、恐ろしいアイデアの 1 つだけでした。
私の質問は、なぜこれらのステートメントを評価するのにそんなに時間がかかるのですか? また、最後の例が実行されないのはなぜですか? PHP は 0 XOR 1 を解釈して と を比較しtrue
ているとfalse
思いましたが、それらを置き換えて評価することはできませんでした。ここで何が起こっているか知っている人はいますか?ありがとう!
アップデート:
コメントは a を要求しましたvar_dump($this->header)
(明らかでない場合に備えて、同じコードのスパム行を避けるために、最初の switch ステートメントを 7 ケースから 4 ケースに切り捨てましたが、var_dump()
が要求された場合に備えて、すべてを投稿することにしました。予想できなかったことが明らかになりました!)array_values()
また、はい、以下の2番目の回答で、設定する前に呼び出すのを忘れたため、連想配列を使用していたことがわかりました。このエラーを作成すると、ステートメント$this->header
の期間が説明されますが、最初の回答と2番目switch
一緒に答えることは、ロジックの優れたウォークスルーです。
array(12) {
["theZone"]=>
NULL
["leftMiss"]=>
NULL
["rightMiss"]=>
NULL
["leftError"]=>
NULL
["rightError"]=>
NULL
["leftHit"]=>
NULL
["rightHit"]=>
NULL
["accuracy"]=>
string(5) "false"
["rt"]=>
string(4) "true"
["disease"]=>
string(3) "yes"
["bars"]=>
string(3) "yes"
["endMessage"]=>
NULL
}