На сайте 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? с ключ?
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
Других решений пока нет …