慎用PHP的unset、array_unique方法

背景


在平常工做中,可能會常常遇到一些PHP的代碼場景,須要咱們去除數組中的某個項,一般會直接調用unset方法,可是若是用得不妥,會給本身挖坑json

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值以後的數組中的第一我的的年齡code

$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.input

3.深刻研究

咱們接下來調用其餘PHP的數組相關方法進行驗證,看其餘方法是否能正常反饋結果
除了unset會去除數組項外,array_unique方法會去除重複項,如下方法演示:foreach

$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

相關文章
相關標籤/搜索