背景
在日常工作中,可能會經常遇到一些PHP的程式碼場景,需要我們去除陣列中的某個項,通常會直接呼叫unset方法,但是如果用得不妥,會給自己挖坑
1.實操
以下使用具體例子進行證明
假設有陣列如下值:
$age_arr=[0,12,43,34,24,63,90];
1).設定場景是去除年齡為0的數值.簡單方法如下:
foreach($age_arr as $k=>$age){
if($age==0){
unset($age_arr[$k]);
}
}
2).設定場景取去除0值之後的陣列中的第一個人的年齡
$first_people=$age_arr[0];
結果會報錯,Undefined offset: 0
2.剖析
為什麼會報錯呢?帶著疑問,我們嘗試輸出unset前後的陣列,檢視其的區別
$age_arr=[0,12,43,34,24,63,90];
echo `unset前 :`.json_encode($age_arr).`</br>`;
unset($age_arr[0]);
echo `unset後 :`.json_encode($age_arr).`</br>`;
輸出結果:
unset前 :[0,12,43,34,24,63,90]
unset後 :{"1":12,"2":43,"3":34,"4":24,"5":63,"6":90}
由上可得知,對陣列進行unset操作的時候,PHP會將陣列轉化為關聯陣列。當我們使用json_encode的時候,會導致資料結構不一致。而當unset方法執行後,陣列會去除相應索引下標指定的值,並且不會重置索引。如上結果可知原先下標為0的已經沒了,但為1的不會變成0.
3.深入研究
我們接下來呼叫其他PHP的陣列相關方法進行驗證,看其他方法是否能正常反饋結果
除了unset會去除陣列項外,array_unique方法會去除重複項,以下方法演示:
$age_arr=[0,12,43,34,24,63,43,90];
echo `array_unique前 :`.json_encode($age_arr).`</br>`;
$age_arr=array_unique($age_arr);
echo `array_unique後 :`.json_encode($age_arr).`</br>`;
結果:
array_unique前 :[0,12,43,34,24,63,43,90]
array_unique後 :{"0":0,"1":12,"2":43,"3":34,"4":24,"5":63,"7":90}
由上可得知,對陣列進行array_unique操作的時候,PHP會將陣列轉化為關聯陣列。而當array_unique方法執行後,陣列會去除相應索引下標指定的值,並且不會重置索引。如上結果可知原先下標為6的已經沒了,但為7的不會變成6.
故當使用unset、array_unique時,都會轉換成關聯陣列,後續邏輯如使用中括號索引取值,必然會有問題,需謹慎!
4.解決辦法
使用array_values方法進行重置索引排序。
官方文件介紹如下:
array_values
(PHP 4, PHP 5, PHP 7)
array_values — 返回陣列中所有的值
說明
array array_values( array $array)
array_values() 返回 input 陣列中所有的值並給其建立數字索引。
by KingFer