# PHP如何查詢是否包含指定數組值
## 前言
在PHP開發中,數組是最常用的數據結構之一。經常需要判斷一個數組中是否包含特定的值或元素。本文將詳細介紹PHP中查詢數組是否包含指定值的多種方法,包括內置函數、循環遍歷以及性能對比等,幫助開發者選擇最適合業務場景的方案。
---
## 一、使用in_array()函數
### 基本用法
`in_array()`是PHP最直接的數組查詢函數:
```php
$fruits = ['apple', 'banana', 'orange'];
if (in_array('banana', $fruits)) {
echo '找到香蕉';
}
第三個參數開啟嚴格類型檢查:
$numbers = ['1', 2, 3];
var_dump(in_array(1, $numbers)); // true(弱類型)
var_dump(in_array(1, $numbers, true)); // false(嚴格模式)
返回第一個匹配元素的鍵名:
$colors = ['r' => 'red', 'g' => 'green'];
$key = array_search('green', $colors); // 返回'g'
if (array_search('value', $array) !== false) {
// 明確判斷防止0鍵名誤判
}
$user = ['name' => 'John', 'age' => 25];
isset($user['age']); // true
array_key_exists('age', $user); // true
函數 | 檢查NULL值 | 性能 |
---|---|---|
isset() | 返回false | 更快 |
array_key_exists() | 返回true | 略慢 |
function customInArray($needle, $haystack) {
foreach ($haystack as $item) {
if ($item === $needle) {
return true;
}
}
return false;
}
將值轉為鍵名實現O(1)查詢:
$flipped = array_flip($fruits);
isset($flipped['banana']); // true
$largeArray = range(1, 10000);
// 測試in_array
$start = microtime(true);
in_array(9999, $largeArray);
$time1 = microtime(true) - $start;
// 測試array_flip+isset
$start = microtime(true);
$flipped = array_flip($largeArray);
isset($flipped[9999]);
$time2 = microtime(true) - $start;
方法 | 1000元素 | 10000元素 | 100000元素 |
---|---|---|---|
in_array() | 0.0002 | 0.0021 | 0.021 |
array_flip()+isset() | 0.0001 | 0.0003 | 0.002 |
$users = [
['id' => 1, 'name' => 'Tom'],
['id' => 2, 'name' => 'Jerry']
];
$names = array_column($users, 'name');
in_array('Tom', $names); // true
function deepInArray($value, $array) {
foreach ($array as $item) {
if (is_array($item) ? deepInArray($value, $item) : $item === $value) {
return true;
}
}
return false;
}
$allowedExtensions = ['jpg', 'png', 'gif'];
if (!in_array($fileExt, $allowedExtensions)) {
throw new Exception('文件類型不支持');
}
$existingEmails = array_column($users, 'email');
if (!in_array($newEmail, $existingEmails)) {
$db->insert($newUser);
}
in_array()
array_search()
array_flip()+isset()
array_column()
array_flip()
預處理ArrayObject
類”`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。