PHP7:更新迭代属性的问题

时间:2017-08-23 22:27:08

标签: php php-7

为什么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/

2 个答案:

答案 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>