为什么PHP7中的foreach
会在更新的对象属性上再次迭代?考虑下面,我只想在所有名字后附加“o”。
$people = [
(object) ['first' => 'Bill', 'last' => 'Gates'],
(object) ['first' => 'Steve', 'last' => 'Jobs']
];
foreach ($people as $i=>$p) {
foreach ($p as $key=>$value) {
echo "$key, $value<br>";
if ($key == 'first') $p->first = $value . 'o';
}
echo "<br>";
}
输出:
first, Bill
first, Billo
last, Gates
first, Steve
first, Steveo
last, Jobs
将上面的内容粘贴到使用PHP 7.0.22
的http://phpfiddle.org/中答案 0 :(得分:1)
好的,看起来 PHP 7.1 解决了这个问题。我正在测试 PHP 7.0.22 。
答案 1 :(得分:1)
它似乎是php版本中的一个错误。
您可以升级版本,也可以使用array_map()
来避免此错误。
您正在尝试执行一种名为mapping
的技术来连接特定的元素值。 array_map()
专为此目的而设计。
代码:(Demo)
$people = [
(object) ['first' => 'Bill', 'last' => 'Gates'],
(object) ['first' => 'Steve', 'last' => 'Jobs']
];
foreach ($people as $i=>$p) {
foreach ($p as $key=>$value) {
echo "$key, $value<br>";
if ($key == 'first') $p->first = $value . 'o';
}
echo "<br>";
}
echo "\n\n";
$people = [
(object) ['first' => 'Bill', 'last' => 'Gates'],
(object) ['first' => 'Steve', 'last' => 'Jobs']
];
$people=array_map(function($a){$a->first.='o'; return $a;},$people);
foreach ($people as $i=>$p) {
foreach ($p as $key=>$value) {
echo "$key, $value<br>";
}
echo "<br>";
}
输出:
first, Bill<br>first, Billo<br>last, Gates<br><br>first, Steve<br>first, Steveo<br>last, Jobs<br><br>
first, Billo<br>last, Gates<br><br>first, Steveo<br>last, Jobs<br><br>