Как добавить элемент с ключом, используя ArrayIterator в PHP?

На сайте PHP нет документации по ArrayIterator объект за пределами базовой ссылки на параметр, поэтому я даже не уверен, что это возможно.

Я понимаю концепцию ArrayIterator в базовом смысле, как этот пример:

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

В моем случае массив строк немного сложнее (хотя и в этом примере все еще упрощен) …

$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? с ключ?

3

Решение

ArrayIterator инвентарь ArrayAccess интерфейс. Это значит, что offsetset доступно, и вы можете присвоить значение указанному смещению.

Как сказал для каждого документация:

Для того, чтобы иметь возможность напрямую изменять элементы массива в цикле
предшествует $ 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

демонстрация.

1

Другие решения

Других решений пока нет …