【发布时间】:2013-11-04 19:22:46
【问题描述】:
我正在编写 PHP 代码来对数组中的每个值进行一些转换,然后从外部源(MySQL 游标或另一个数组)将一些值添加到数组中。如果我使用foreach 和转换数组值的引用
<?php
$data = array('a','b','c');
foreach( $data as &$x )
$x = strtoupper($x);
$extradata = array('d','e','f');
// actually it was MySQL cursor
while( list($i,$x) = each($extradata) ) {
$data[] = strtoupper($x);
}
print_r($data);
?>
数据已损坏。所以我得到了
Array ( [0]=>A [1]=>B [2]=> [3]=>D [4]=>E [5] =>F )
而不是
Array ( [0]=>A [1]=>B [2]=>C [3]=>D [4]=>E [5] =>F )
当我不使用参考而写作时
foreach( $data as &$x )
$x = strtoupper($x);
当然不会发生转换,但数据也没有损坏,所以我明白了
Array ( [0]=>a [1]=>b [2]=>c [3]=>D [4]=>E [5] =>F )
如果我写这样的代码
<?php
$result = array();
$data1 = array('a','b','c');
foreach( $data1 as $x )
$result[] = strtoupper($x);
$data2 = array('d','e','f');
// actually it was MySQL cursor
while( list($i,$x) = each($data2) ) {
$result[] = strtoupper($x);
}
print_r($result);
?>
一切都按预期进行。
Array ( [0]=>A [1]=>B [2]=>C [3]=>D [4]=>E [5] =>F )
当然,我复制数据解决了这个问题。但我想了解该参考有何奇怪的问题,以及如何避免此类问题。也许在代码中使用 PHP 引用通常是不好的(就像许多人所说的 C 指针)?
【问题讨论】:
-
我已经在我的 PHP 安装 (win64-5.4.7) 上确认了相同的行为 - 我不知道为什么只有
C消失了。如果您改用var_dump,您会看到C已经来到&NULL。 -
一个奇怪的代码。你想达到什么目的?为什么不先合并数组? (
array_merge(), php.net/array_merge) 然后运行array_map()(php.net/array_map) 改变大小写。 -
> 为什么不先合并数组呢?最初我试图附加从 MySQL 游标中获取的值。后来我简化了代码,把它放到PHPfiddle中,制作了光标数组。
-
@deceze "可能重复" - 我已经尝试并看到随后的一对
foreach循环可以正常工作!但是foreach之后的While会导致这种奇怪的行为。 -
一步一步的解释应该解释发生了什么。您只需考虑分配给引用时会发生什么。无论是第二个
foreach、while还是简单的=,都无关紧要。