在PHP 的日常開發中, array_diff()函數常被用於對數組進行差集操作。它可以幫助我們找出在一個數組中存在、但在其他數組中不存在的值。這在處理數據過濾、權限控制等場景中非常實用。
不過一個經常被忽略的問題是: array_diff()返回結果時會保留原數組的鍵名嗎?還是說,它會自動重新索引數組?
先看一個簡單的例子:
<?php
$array1 = ["a" => "green", "b" => "brown", "c" => "blue", "red"];
$array2 = ["green", "yellow", "red"];
$result = array_diff($array1, $array2);
print_r($result);
?>
輸出結果為:
Array
(
[b] => brown
[c] => blue
)
可以看到, array_diff()返回的結果保留了原數組$array1的鍵名。即便是字符串鍵,它也沒有被重新索引。
如果你確實想重新索引結果數組,可以手動使用array_values() :
$reindexed = array_values(array_diff($array1, $array2));
print_r($reindexed);
輸出:
Array
(
[0] => brown
[1] => blue
)
這種情況下,鍵名被重置為從0開始的連續數字索引。
假設用戶提交了一組標籤,而你希望移除其中已經存在於系統默認標籤中的內容:
<?php
$userTags = [
10 => "php",
11 => "html",
12 => "custom"
];
$defaultTags = ["php", "html", "css", "javascript"];
$finalTags = array_diff($userTags, $defaultTags);
print_r($finalTags);
?>
輸出結果:
Array
(
[12] => custom
)
這表明函數確實保留了用戶原始數組的鍵名,這在數據庫插入或更新操作中可能是很有價值的信息。
array_diff()只比較值,不考慮鍵名。
如果你希望基於鍵名進行比較,可以使用array_diff_key() 。
如果要同時比較鍵名和值,可以使用array_diff_assoc() 。