1 月 10 2013
[PHP] foreach() 會踩到的陷阱 ( bug ? )
今天在公司處理某支程式時,發現使用 PHP 的 foreach() 可能會踩到這個陷阱(或許算是 bug ?! )。
以下這段範例程式,結果是正確的。
<?php $arr = array(); array_push( $arr , 1 ); array_push( $arr , 2 ); array_push( $arr , 3 ); $arr['a'] = 'A'; $arr['b'] = 'B'; $arr['c'] = 'C'; foreach ( $arr as $k => $v ) { echo "$k => $v" . PHP_EOL; } ?>
結果:
0 => 1 1 => 2 2 => 3 a => A b => B c => C
但下面這段範例程式的結果就很妙了…
<?php $arr = array(); array_push( $arr , 1 ); array_push( $arr , 2 ); array_push( $arr , 3 ); $arr['a'] = 'A'; $arr['b'] = 'B'; $arr['c'] = 'C'; foreach ( $arr as $k => $v ) { if ( $k == 'b' ) { echo "$k => $v" . PHP_EOL; } if ( $k === 'b' ) { echo "$k ==> $v" . PHP_EOL; } } ?>
結果:
0 => 1 b => B b ==> B
路人
2013-01-10 @ 19:42
跟 foreach 沒有關係 ?
jnlin
2013-01-10 @ 20:54
因為 ‘b’ 被轉型成 0 了
Joe Horn
2013-01-11 @ 09:02
看來問題在 if … else … ?
Jerry
2013-06-04 @ 11:01
这个不是foreach的问题。
0 == 任何字符串都是返回true。类似还有empty(“0”) 也返回true.
对人类来说这些有时真的很费解,不过看样子对于PHP不是个BUG.
参考: http://php.net/manual/en/types.comparisons.php