3

除了基本参数参考之外,PHP 站点上没有关于该ArrayIterator对象的文档,所以我什至不确定这是可能的。

我从ArrayIterator基本意义上理解了这个例子的概念:

$rows = new ArrayIterator(array('a', 'b', 'c'));
foreach ($rows as $row) {
    echo "<p>This is row {$a}.</p>";
}

在我的例子中, rows 数组有点复杂(尽管为了这个例子仍然简化了)......

$rows = array(
    'a' => NULL,
    'b' => array('d' => NULL, 'e' => NULL, 'f' => NULL),
    'c' => NULL
);
$rows = new ArrayIterator($rows);

这个想法是,'b'在这种情况下,有一些子元素应该像父元素一样被解析,在其余父元素(a,b,c)的末尾(不需要按顺序处理) .

通常我只会使用...

foreach ($child as $c) {
    $rows->append($c);
}

但在这种情况下$child,是一个带有我想要维护的键的数组......

foreach ($child as $key => $c) {
    $rows->append($c);  // but what about $key???
}

我不想在最后添加一个数组作为元素,我想将添加到父列表中,这样我们最终会得到......

$rows = array(
    'a' => ...,
    'b' => ...,
    'c' => ...,
    'd' => ...,
    'e' => ...,
    'f' => ...
);

问题:是否可以使用键从 foreach 循环中将元素附加到当前迭代数组?

4

1 回答 1

1

ArrayIterator实现ArrayAccess接口。这意味着它offsetset是可用的,您可以为指定的偏移量分配一个值。

正如foreach文档所说:

为了能够直接修改循环内的数组元素,在 $value 之前加上 &。在这种情况下,该值将通过引用分配。

但在这种情况下是不需要的。

$rows = array(
    'a' => 1,
    'b' => array('d' => 3, 'e' => 4, 'f' => 5),
    'c' => 2
);

$rows = new ArrayIterator($rows);

foreach ($rows as $key => $row) {
    if (is_array($row)) { 
        foreach ($row as $key => $c) {
            $rows[$key] = $c;
        }

        // skip this
        continue;
    }

    echo $key, " ", $row, "\n";
}

这个打印:

a 1
c 2
d 3
e 4
f 5

演示

于 2016-01-22T20:26:50.757 回答