$arr = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
比如我想從c開始迴圈,怎麼寫?
回複討論(解決方案)
這樣可以達到你要的?擷取array的鍵名,如果鍵名等於c才進入迴圈。
這樣可以達到你要的?擷取array的鍵名,如果鍵名等於c才進入迴圈。
能否詳細一點啊?
$arr = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
$arr1 = array_slice($arr, 2); // ?arr的下?2?始取出
foreach($arr1 as $key=>$val){
echo $key.'='.$val.'
';
}
$arr = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
$arr1 = array_slice($arr, 2); // ?arr的下?2?始取出
foreach($arr1 as $key=>$val){
echo $key.'='.$val.'
';
}
可是這個下標不一定在第二位啊,,也可能c的前面有十個呢,或者有一百呢?
$arr = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);$flag = 0;foreach($arr as $key=>$val){if($key=='c'){$flag = 1;}if($flag==1){echo $key.'='.$val.'
';}}
??好?。
$arr = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);$index = array_search('c',array_keys($arr));$arr1 = array_slice($arr, $index);foreach($arr1 as $key=>$val){echo $key.'='.$val.'
';}
樓上的說的不錯。。
其實 #5 的思路是對的:遍曆一遍,不對指定鍵出現之前的資料做處理
而 #6 的代碼需要抄寫指定鍵及以後的資料,至少要多消耗寫記憶體
$arr = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);$flag = false;foreach($arr as $key=>$val){ if(! ($flag = $flag ? $flag : $key == 'c')) continue; echo $key.'='.$val.'
';}
寫成這樣,更合理些
$arr = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);foreach($arr as $key=>$val){ if(! ($flag = $key == 'c' ? true : !empty($flag))) continue; echo $key.'='.$val.'
';}
學習了,又瞭解了幾個數組函數的用法
$a = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);for (;;next($a)) { if ( key($a) == 'c' ) {while (list($key, $val) = each($a)) {echo "$key => $val
";}break;}}
有沒有辦法根據鍵名獲得在數組中的位置指標
做迴圈的時候直接從指標開始
從頭遍曆有時間浪費,而且foreach棄置站台申請了一塊不必要記憶體
6樓和9樓的代碼很好了,不過用過彙編和C++的表示對核心代碼有強迫症...
吃完飯研究下php手冊中的數組函數
$i = $v = 0;echo memory_get_usage(), PHP_EOL;$a = array(1,2,3,4,5,6,7);echo memory_get_usage(), PHP_EOL;foreach($a as $i=>$v) { echo $i, ' ', memory_get_usage(), PHP_EOL; break;}echo memory_get_usage(), PHP_EOL;123792
124520
0 124520
124520
顯然
foreach棄置站台申請了一塊不必要記憶體 是不正確的
有沒有辦法根據鍵名獲得在數組中的位置指標
做迴圈的時候直接從指標開始
從頭遍曆有時間浪費,而且foreach棄置站台申請了一塊不必要記憶體
6樓和9樓的代碼很好了,不過用過彙編和C++的表示對核心代碼有強迫症...
吃完飯研究下php手冊中的數組函數
有沒有辦法根據鍵名獲得在數組中的位置指標
做迴圈的時候直接從指標開始
從頭遍曆有時間浪費,而且foreach棄置站台申請了一塊不必要記憶體
6樓和9樓的代碼很好了,不過用過彙編和C++的表示對核心代碼有強迫症...
吃完飯研究下php手冊中的數組函數
$i = $v = 0;echo memory_get_usage(), PHP_EOL;$a = array(1,2,3,4,5,6,7);echo memory_get_usage(), PHP_EOL;foreach($a as $i=>$v) { echo $i, ' ', memory_get_usage(), PHP_EOL; break;}echo memory_get_usage(), PHP_EOL;123792
124520
0 124520
124520
顯然
foreach棄置站台申請了一塊不必要記憶體 是不正確的
感謝xu大指正...剛學習的時候認為foreach是直接迴圈原數組,後來看到哪的文章還是部落格的,foreach是複製一份再遍曆,內容真是忘了,$value棄置站台應該不會重新整理記憶...我仔細看看
$i = $v = 0;echo memory_get_usage(), PHP_EOL;$a = array(1,2,3,4,5,6,7);echo memory_get_usage(), PHP_EOL;foreach($a as $i=>$v) { echo $i, ' ', memory_get_usage(), PHP_EOL; break;}echo memory_get_usage(), PHP_EOL;123792
124520
0 124520
124520
顯然
foreach棄置站台申請了一塊不必要記憶體 是不正確的
原來是我腦補錯了...
';foreach (fn() as $k => $v) { echo memory_get_usage() . '
';}echo memory_get_usage() . '
';
分別對全域變數的數組和函數返回的數組做測試,結果是不一樣的,foreach會緩衝函數運行結果,迴圈結束立刻釋放,而遇到已存在變數就直接引用
那是當然的
你 fn() 返回的數組總得要有人來接吧?
沒有給真實的變數,php也要把它放在堆棧中吧
學習了,又瞭解了幾個數組函數的用法
你又來了我都3級了