我寫了下面的函數用於平陣列:當迭代的數組/集合在循環內部被修改時,foreach控制結構是如何工作的?
function flatten() {
$args = func_get_args();
$items = array();
for ($i = 0; $i < count($args); $i++) { // <-- (*)
$arg =& $args[$i];
if (is_array($arg))
foreach ($arg as &$item)
$args[] =& $item;
else
$items[] = $arg;
}
return $items;
}
我想用簡單的foreach ($args as &$arg)
更換for
線。基於什麼?我曾經寫過一個實現Iterator
接口的類,它基本上是控制結構如何工作的基礎。如果正確地記得什麼foreach
控制結構做如下:
- 使用
rewind()
方法將一個內部索引變量設置爲所述第一元件的位置。 - 使用
valid()
方法測試是否該陣列的端部已經達到。如果是這樣,退出。 - 使用`Iterator接口的
key()
和current()
方法來檢索數組的當前元素的鍵和值。 - 使用
next()
方法的當前一個之後立即設置內部變量索引的元素的位置。 - 轉到2.
至少,這是它與用戶定義的類的作品。我不太確定如何使用內置數組類型。它會以同樣的方式工作嗎?我可以使用foreach
替換for
行嗎?
這是一個很棒的答案。如果可以的話,我會加倍努力。如果在迭代它們之前我已經知道PHP **拷貝**數組,我將總是*遍歷數組的引用。我每天都討厭PHP多一點。 – pyon 2011-05-03 20:27:49
'is_array'和'array_merge'函數是否也通過值而不是通過引用接受數組? – pyon 2011-05-03 20:31:55
據我瞭解,PHP引用是同一事物的別名,所以引用應該與原始文件完全相同。引用一個對象只是強制PHP對原始文件執行操作,因爲所有的變化都需要一次對所有的引用都可見。 – 2011-05-03 20:46:35