1. 程式人生 > 其它 >PHP開發過程的那些坑(三) ——PHParray_shift函式

PHP開發過程的那些坑(三) ——PHParray_shift函式

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

相關閱讀:

PHP開發過程的那些坑(二) ——PHP empty函式

PHP開發過程的那些坑(一) ——物件拷貝