關聯數組是 PHP 處理鍵值對數據的核心結構。本文系統整理 array_key_exists、array_search、array_keys、array_values、key/next/current 遍歷函數族的用法、區別與最佳實踐,助你高效操作數組。
array_key_exists()<?php
$state = [
"Delaware" => "December 7, 1787",
"Pennsylvania" => "December 12, 1787",
"Ohio" => "March 1, 1803"
];
if (array_key_exists("Ohio", $state)) {
printf("Ohio joined the Union on %s", $state["Ohio"]);
}
// 輸出: Ohio joined the Union on March 1, 1803
?>
bool,僅檢查鍵是否存在,不檢查值。isset($arr['key'])(後者值為 null 返回 false)。array_search()<?php
$state = [
"Ohio" => "March 1",
"Delaware" => "December 7",
"Pennsylvania" => "December 12"
];
$founded = array_search("December 7", $state);
if ($founded) {
printf("%s was founded on %s.", $founded, $state[$founded]);
}
// 輸出: Delaware was founded on December 7.
?>
false。'1' == 1 為 true),傳入第三參數 true 啟用嚴格模式 ===。array_keys($arr, $value)。array_keys()<?php
$state = [
"Delaware" => "December 7, 1787",
"Pennsylvania" => "December 12, 1787",
"New Jersey" => "December 18, 1787"
];
$keys = array_keys($state);
print_r($keys);
/* 輸出:
Array
(
[0] => Delaware
[1] => Pennsylvania
[2] => New Jersey
)
*/
// 可選第二參數:只返回值等於 "December 7, 1787" 的鍵
$keys = array_keys($state, "December 7, 1787");
?>
array_values()<?php
$population = [
"Ohio" => "11,421,267",
"Iowa" => "2,936,760"
];
print_r(array_values($population));
/* 輸出: 重新索引的數值數組
Array
(
[0] => 11,421,267
[1] => 2,936,760
)
*/
json_encode 輸出純列表。| 函數 | 作用 | 指針移動 |
|---|---|---|
key($arr) | 返回當前指針位置的鍵 | 否 |
current($arr) | 返回當前指針位置的值 | 否 |
next($arr) | 指針前移一位,返回新位置的值 | 是 |
prev($arr) | 指針後移一位 | 是 |
reset($arr) | 指針重置到第一個,返回首值 | 是 |
end($arr) | 指針移到最後,返回尾值 | 是 |
each($arr) | 返回當前鍵值對並前移(PHP 7.2 棄用,建議用 foreach) | 是 |
<?php
$capitals = ["Ohio" => "Columbus", "Iowa" => "Des Moines"];
echo "<p>Can you name the capitals of these states?</p>";
while ($key = key($capitals)) {
printf("%s <br>", $key);
next($capitals); // 關鍵:必須移動指針,否則死循環
}
// 輸出: Ohio <br> Iowa <br>
?>
foreach 一統江湖<?php
// 1. 只需值
foreach ($arr as $value) { ... }
// 2. 需要鍵值
foreach ($arr as $key => $value) { ... }
// 3. 引用修改原值
foreach ($arr as &$value) { $value = strtoupper($value); }
unset($value); // 好習慣:銷毀引用
?>
| 陷阱 | 原因 | 對策 |
|---|---|---|
isset($arr['key']) 判斷鍵存在 | 值為 null 返回 false | 用 array_key_exists 或 array_key_exists('key', $arr) |
array_search 返回 0 導致 if 判斷失敗 | 0 == false 為 true | 用 !== false 或 array_keys($arr, $val) 取數組 |
foreach 引用殘留污染後續循環 | 引用變量在循環外保留 | 循環後 unset($value) |
| 內部指針函數混用導致位置錯亂 | 全局指針共享 | 棄用指針函數,全面改用 foreach |
array_key_existsarray_search (單個) / array_keys($arr, $val) (多個)array_keysarray_valuesforeach熟練掌握這組函數,讓數組操作代碼更健壯、可讀、高效。