起因:應用中,有一個資料是使用陣列的鍵名來unset刪除的,大概是這樣 unset($arr[$key]) ,但是點選刪除,並沒被刪除
經過我debug後,發現是array_reverse函式的問題,下面我復現一下錯誤:
$arr = [
"aaa" => 111,
"bbb" => 222,
"2021" => 333,
"ccc" => 444
];
$arr1 = array_reverse($arr);
var_dump($arr1);
/*array(4) {
["ccc"]=>
int(444)
[0]=>
int(333)
["bbb"]=>
int(222)
["aaa"]=>
int(111)
}*/
//可以看到 "2021" => 333 變為 0=> 333 了
foreach($arr1 as $k => $v) {
if($v==333) unset($arr[$k]); //此時$k為0,源陣列中並不存在這個鍵,無法刪除,且這裡不會報錯的
}
var_dump($arr);
/*
array(4) {
["aaa"]=>
int(111)
["bbb"]=>
int(222)
[2021]=>
int(333)
["ccc"]=>
int(444)
}
*/
我們再看看有多個數值鍵的情況:
可以得出,array_reverse對數值鍵,會轉為初始從0開始的索引,多個就是按順序 0,1,2,… ; 這裡要特別注意 ;數值鍵是會改變的;
本作品採用《CC 協議》,轉載必須註明作者和本文連結