踩坑:array_reverse 轉換改變了數值鍵問題

junwind發表於2021-02-26

起因:應用中,有一個資料是使用陣列的鍵名來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 轉換改變了數值鍵問題

可以得出,array_reverse對數值鍵,會轉為初始從0開始的索引,多個就是按順序 0,1,2,… ; 這裡要特別注意 ;數值鍵是會改變的;

本作品採用《CC 協議》,轉載必須註明作者和本文連結
六月的風

相關文章