2009-07-01, 02:24 PM
2009-07-01, 02:37 PM
[hightman 于 2009/07/01 14:00 提交]
在对数组进行循环遍历时, 可以采用 each() 也可以采用 foreach, 但应该注意的是 foreach 中对于参数数组是一份形参一样的拷贝体, 如果您在循环体内又对数组添加或删除元素, 则不会对此次循环起作用.
具体差异代码如下:
这段代码是不会打印出 c 这个新加入的元素的, 改用 each 时如下代码就可以打印出 'c' 这个元素了, 所以在循环时如果还对数组进修改动的话要注意这个问题.
在对数组进行循环遍历时, 可以采用 each() 也可以采用 foreach, 但应该注意的是 foreach 中对于参数数组是一份形参一样的拷贝体, 如果您在循环体内又对数组添加或删除元素, 则不会对此次循环起作用.
具体差异代码如下:
PHP 代码:
$arr = array('a', 'b');
foreach ($arr as $key => $value)
{
echo "$key => $value\n";
if ($value == 'b') $arr[] = 'c';
}
PHP 代码:
$arr = array('a', 'b');
reset($arr);
while (list($key, $value) = each($arr))
{
echo "$key => $value\n";
if ($value == 'b') $arr[] = 'c';
}
2009-07-01, 02:42 PM
[闲蛋超人 于 2009/07/01 15:00 提交]
先看以下一段代码, 然后再谈结果方便一些
这段代码的运行结果是 a=1, 因为在 test() 函数声明的 global $a 中间又被处理成 $b 的引用, 而本质上 global $a 可以理解为 $a = &$GLOBALS['a'], 所以 当 $a 重新指向了 $b 的引用后, 它的值再发生改变时并不会影响到真正的全局变量了.
先看以下一段代码, 然后再谈结果方便一些
PHP 代码:
function test()
{
global $a;
$b = $a + 1;
$a = &$b;
$a++;
}
$a = 1;
test();
echo "a=$a\n";
2009-07-01, 03:41 PM
hightman 提交,
其实这个是我多年以前犯过的一个小错误, 再拿出来说说, 虽然 php 开发小组很早就提供了 === 功能, 但很多时候由于种种原因还是会用 == 来比较. 先看代码:
这代码原意是想输出 value 而已, 结果连 first 也输出来了 ...
像 mysql_fetch_array() 默认情况下也是返回数字+字段名双重索引的数组, 这时如果 == 来判断键名可能就会出错咯..
其实这个是我多年以前犯过的一个小错误, 再拿出来说说, 虽然 php 开发小组很早就提供了 === 功能, 但很多时候由于种种原因还是会用 == 来比较. 先看代码:
PHP 代码:
$key = 'key';
$arr = array('first', 'key' => 'value');
foreach ($arr as $k => $v)
{
if ($key == $k)
echo "found: $v\n";
}
像 mysql_fetch_array() 默认情况下也是返回数字+字段名双重索引的数组, 这时如果 == 来判断键名可能就会出错咯..
2011-08-11, 05:31 PM
(2009-07-01 03:41 PM)hightman 提到: [ -> ]hightman 提交,
其实这个是我多年以前犯过的一个小错误, 再拿出来说说, 虽然 php 开发小组很早就提供了 === 功能, 但很多时候由于种种原因还是会用 == 来比较. 先看代码:
这代码原意是想输出 value 而已, 结果连 first 也输出来了 ...PHP 代码:
$key = 'key';
$arr = array('first', 'key' => 'value');
foreach ($arr as $k => $v)
{
if ($key == $k)
echo "found: $v\n";
}
像 mysql_fetch_array() 默认情况下也是返回数字+字段名双重索引的数组, 这时如果 == 来判断键名可能就会出错咯..
这主要是因为$key 与 0 对比条件是成立的。