Hash Table
Also Known As
hash map
dictionary
associative array
TL;DR
A data structure that maps keys to values using a hash function, providing amortised O(1) average-case lookups, insertions, and deletions.
Explanation
A hash function converts a key to an array index. Collisions (two keys hashing to the same index) are resolved by chaining (linked list per bucket) or open addressing (probing for the next free slot). PHP arrays are hash tables internally, which is why isset() is O(1) but in_array() is O(n). Understanding hash tables explains why flipping an array enables O(1) lookups.
Diagram
flowchart TD
K1[key: email] & K2[key: name] & K3[key: age] --> HASH[Hash Function]
HASH --> B1[Bucket 1: email - alice@...]
HASH --> B3[Bucket 3: name - Alice]
HASH --> B4[Bucket 4: age - 30]
B1 -->|collision chaining| B1B[another key - value]
INFO[O of 1 average lookup<br/>O of n worst case with collisions]
style HASH fill:#6e40c9,color:#fff
style B1 fill:#238636,color:#fff
style B3 fill:#238636,color:#fff
style B4 fill:#238636,color:#fff
style INFO fill:#1f6feb,color:#fff
Common Misconception
✗ PHP arrays are arrays — they are actually ordered hash maps, which is why they have O(1) key lookup but can also be iterated in insertion order.
Why It Matters
Replacing in_array() with array_flip() + isset() turns O(n) lookups to O(1), transforming quadratic algorithms into linear ones for large datasets.
Common Mistakes
- Using in_array() in a loop — O(n) per call makes the loop O(n²); flip the array for O(1) lookup.
- Not understanding that hash collisions degrade performance — a poor hash function can make O(1) into O(n).
- Using objects as hash keys in PHP without SplObjectStorage or WeakMap — objects are not valid array keys.
- Assuming hash table iteration order — PHP arrays preserve insertion order but most hash table implementations do not.
Code Examples
✗ Vulnerable
// O(n²) — in_array inside a loop:
$banned = ['alice', 'bob', 'charlie']; // Could be 10,000 entries
foreach ($users as $user) {
if (in_array($user->name, $banned)) block($user); // O(n) per iteration
}
✓ Fixed
// O(n) total — flip for O(1) lookup:
$banned = array_flip(['alice', 'bob', 'charlie']);
foreach ($users as $user) {
if (isset($banned[$user->name])) block($user); // O(1) per iteration
}
References
Tags
🤝 Adopt this term
£79/year · your link shown here
Added
15 Mar 2026
Edited
22 Mar 2026
Views
41
🤖 AI Guestbook educational data only
|
|
Last 30 days
Agents 0
No pings yet today
No pings yesterday
Perplexity 13
Amazonbot 13
Ahrefs 3
Unknown AI 2
Google 2
Majestic 1
SEMrush 1
Also referenced
How they use it
crawler 34
crawler_json 1
Related categories
⚡
DEV INTEL
Tools & Severity
🟡 Medium
⚙ Fix effort: Low
⚡ Quick Fix
Use PHP arrays as hash tables for O(1) lookups — flip an array with array_flip() to convert values-to-keys for fast membership testing instead of in_array()
📦 Applies To
PHP 5.0+
web
cli
queue-worker
🔗 Prerequisites
🔍 Detection Hints
in_array() called inside a loop on a large array — O(n) per call; should be precomputed array_flip() for O(1)
Auto-detectable:
✓ Yes
phpstan
blackfire
⚠ Related Problems
🤖 AI Agent
Confidence: Low
False Positives: High
✗ Manual fix
Fix: Medium
Context: Function