foreach($items as item){ //在$items裡面刪除$item會影響迴圈的次數莫???}
因為我的這個$items數組很長。裡面的每個item我只需要使用一次。然後就不會使用了。
我的想法就是使用一個刪除一個。這樣迴圈的元素就會越來越少。這個迴圈的已耗用時間就會比原來短。這種認識合理莫???
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 36 bytes)
測試的時候這個錯誤如何解???
回複內容:
foreach($items as item){ //在$items裡面刪除$item會影響迴圈的次數莫???}
因為我的這個$items數組很長。裡面的每個item我只需要使用一次。然後就不會使用了。
我的想法就是使用一個刪除一個。這樣迴圈的元素就會越來越少。這個迴圈的已耗用時間就會比原來短。這種認識合理莫???
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 36 bytes)
測試的時候這個錯誤如何解???
How 'foreach' actually works
這個上面的回答很有深度,表示沒怎麼看明白,但是還是給題主獻上。
不會的、實際行動告訴你。
$value) { unset($items[$key]); print_r($items);}print_r($items);
//迴圈開始Array ( [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) Array ( [2] => 3 [3] => 4 [4] => 5 ) Array ( [3] => 4 [4] => 5 ) Array ( [4] => 5 ) Array ( ) //迴圈結束Array ( )
這個時間不會節省吧,每次迴圈都要對數組剔除,取數組[0],這時間會比每次迴圈直接取數組[i]來的更浪費吧
要想知道結果,最好的方式就是親自實踐一下!
不會吧,遊標還是會一直往前推進呀
不會,數組在遍曆的時候是使用的其一個副本
foreach($items as $key=>item){ unset($items[$key])}
並不會啊,自己動手實踐一下就知道了
並不會刪除,foreach在迴圈的時候,數組下標不斷向前推,你操作一個刪除一個並不會影響。
但是,我想說,這樣操作對樓主所說的很長的數組操作有速度上的最佳化嗎?好像並沒有!
不必要刪除...
foreach的實現方式是藉助數組的內部指標的...你遍曆完這一個,指標就向後移動一個,所以你刪除前面的值對這個根本就沒影響,反而會破壞這個數組,比如遍曆後還要用到這數組呢,而且刪除的過程雖然消耗時間不多,但也是要消耗的...
這樣做並不能減少記憶體啊。不過可以試試array_shift()或者 array_pop()那個函數,後者要比前者快。如果能考慮一下分治就更好了
如果你的數組過大,確實有溢出風險,但是你刪除元素浪費的效能更多。
如果你的php version >= 5.5,建議使用php的新特性Generators。使用這種方法的優點是它可以讓你在處理大資料集合的時候不用一次性的載入到記憶體中。甚至你可以處理無限大的資料流。
預設是不會刪除的,因為是按照值來傳遞的.如果採用"&"進行引用傳遞的,那麼就會直接刪除原來的數組.
並不會被刪除。
對於大數組來講我同意hongchao的看法yield可以協助你用更少的記憶體來完成遍曆任務,但用的時間會更久。
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 36 bytes)
測試的時候這個錯誤如何解???
這個錯誤是你迴圈的時候php使用的的記憶體不夠了 134217728=128M 建議調整php.ini裡面的memory_limit配置
第一,你的遍曆完一個刪一個的思想不但不會最佳化程式效能,反而會增加負擔,因為for each 遍曆是內部指標推動的操作,過程是自動的,耗能很低,而你的想法是每操作完一次刪一個元素對這個指標推進過程沒有絲毫協助,反而新增效能負擔,因為刪除元素也需要一點效能,放大後這些不必要的效能支出就變成一個不必要的累贅了; 第二,提示說明你的記憶體只有128m,不夠用哦
foreach 迴圈每次都會複製把變數的值複製一遍迴圈。