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 沒有關係 ?
2013-01-10 @ 20:54
因為 ‘b’ 被轉型成 0 了
2013-01-11 @ 09:02
看來問題在 if … else … ?
2013-06-04 @ 11:01
这个不是foreach的问题。
0 == 任何字符串都是返回true。类似还有empty(“0”) 也返回true.
对人类来说这些有时真的很费解,不过看样子对于PHP不是个BUG.
参考: http://php.net/manual/en/types.comparisons.php