PHP開發過程的那些坑(三) ——PHParray_shift函式
阿新 • • 發佈:2022-05-03
PHP開發過程的那些坑(三)——PHP array_shift函式
(原創內容,轉載請註明來源,謝謝)
坑:
最近在自學資料結構,常常用PHP實現各種資料結構和演算法。array_shift函式的作用是獲取陣列的第一個元素,並將其從陣列中剔除。用array_shift+array_push可以實現佇列的操作。例如官方手冊的例子:
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = array_shift($stack);
print_r($stack);
結果是
Array( [0] => banana [1] => apple [2]=> raspberry)
但是,當遇到二維陣列時,情況就不一樣了。
$testArr =array(‘a’=>1, ‘b’=>2, ’c’=>3);
print_r(array_shift($testArr));//輸出 1
print_r($testArr);//輸出 Array([0]=>2, [1]=>3)
陣列的下標都被改變了!
分析:
再經過幾次程式碼除錯後,發現確實array_shift函式會改變陣列的下標。查閱網上資料,有一篇文章寫的很好,https://my.oschina.net/u/437615/blog/297378。這篇文章是分析為什麼PHP的array_shift和array_pop同樣作為剔除陣列的一個元素,效能上的差異非常大。
原因是,array_shift在剔除掉第一個元素後,會對陣列進行重新排序。這會導致陣列量大的時候,array_shift的速度會慢的無法忍受。
當然,這也就是我遇到的問題的原因。
改進措施:
將二維陣列擴充套件成三維陣列
$testArr =array(0=>array(‘a’=>1), 1=>array(‘b’=>2), 2=>array(’c’=>3)); print_r(array_shift($testArr));//輸出 array(‘a’=>1) print_r($testArr);//輸出 Array([0]=>array(‘b’=>2), array(’c’=>3))
再用foreach的方式獲取自己想要的內容。這樣即保留了想要的陣列下標,又能實現剔除陣列的第一個元素。
——written by linhxx 2017.07.09