Searching in a multidimensional array in PHP

php
tutorial
array
Nabil Hassen
Nabil Hassen
Oct 15, 2025
Searching in a multidimensional array in PHP
Last updated on Oct 15, 2025
Table of contents:

Mastering multidimensional array search in PHP

Searching in a multidimensional array is a common task in PHP when working with structured data like API responses, configuration arrays, or datasets. In this article, we’ll cover all practical methods to search in a multidimensional array efficiently and accurately.

1. array_column() + array_search()

Use when you have an array of associative arrays and you want the first match by a specific column.

$users = [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob'],
['id' => 3, 'name' => 'Charlie'],
];
 
// get the numeric key of the first element whose 'name' === 'Bob'
$keys = array_column($users, 'name');
$key = array_search('Bob', $keys, true); // use strict mode when you care about types
 
if ($key !== false) {
echo "User found: ID " . $users[$key]['id'];
} else {
echo "User not found.";
}

Notes:

  • array_column() extracts a value column from the input; optionally you can provide a third parameter to index the returned array by another column.
  • array_search() returns the first matching key or false if not found; use the third ($strict) parameter to force === comparison.

2. foreach loop

When you need to search by multiple criteria or across multiple levels, a simple loop gives full control.

$products = [
['id' => 10, 'name' => 'Laptop', 'category' => 'Electronics'],
['id' => 11, 'name' => 'Desk', 'category' => 'Furniture'],
['id' => 12, 'name' => 'Chair', 'category' => 'Furniture'],
];
 
$result = null;
foreach ($products as $product) {
if ($product['id'] === 11) {
$result = $product;
break;
}
}
 
if ($result) {
echo "Product found: {$result['name']}";
} else {
echo "Product not found.";
}

This approach is most flexible, you can add complex conditions, nested checks, or partial matches. It’s also easier to debug.

3. array_filter()

array_filter() returns all elements for which the callback returns true. Keys are preserved; use array_values() to reindex if you want a zero-based result array.

$itEmployees = array_filter($employees, function($employee) {
return isset($employee['department']) && $employee['department'] === 'IT';
});

array_filter() accepts an optional mode to pass keys to the callback; it preserves keys by default.

4. Recursive search for deeply nested arrays (by key/value)

When the structure depth is unpredictable, use a recursive function that examines each level. This example returns the first matching container (associative array) that contains a given key => value pair.

function searchArrayByKeyValue(array $haystack, string $key, $value) {
foreach ($haystack as $element) {
if (!is_array($element)) {
continue;
}
 
if (array_key_exists($key, $element) && $element[$key] === $value) {
return $element;
}
 
// Recurse into nested arrays
$found = searchArrayByKeyValue($element, $key, $value);
if ($found !== null) {
return $found;
}
}
 
return null;
}

Implementation notes:

  • Use array_key_exists() when you need to detect keys that exist with null values. Use isset() for non-null checks.
  • Use strict comparisons (===) unless you intentionally want type coercion.

5. Recursive Search by Value Only (Any Key)

To check whether a scalar value exists anywhere in a multidimensional structure:

function inMultiArray($needle, array $haystack): bool {
foreach ($haystack as $value) {
if (is_array($value)) {
if (inMultiArray($needle, $value)) {
return true;
}
continue;
}
 
if ($value === $needle) { // strict comparison
return true;
}
}
 
return false;
}
 
$array = [
['x' => [1, 2, 3]],
['y' => [4, 5, 6]],
];
 
var_dump(inMultidimensionalArray(5, $array)); // true

If you only need to test top-level values, prefer in_array() with the $strict flag. For deep structures use recursion.

6. Searching by Multiple Conditions

You can combine checks inside array_filter() or loops. Example using array_filter() to find students with grade === 'A' and age === 18:

$students = [
['name' => 'Sara', 'grade' => 'A', 'age' => 17],
['name' => 'Tom', 'grade' => 'B', 'age' => 18],
['name' => 'Liam', 'grade' => 'A', 'age' => 18],
];
 
$result = array_filter($students, function($student) {
return $student['grade'] === 'A' && $student['age'] === 18;
});
 
print_r($result);

Performance & best practices

  • Built-in functions (array_column, array_search, array_filter) are implemented in C and are often faster and clearer than equivalent PHP loops. Use them when applicable.
  • Prefer ===/strict comparisons when comparing values from external sources to avoid surprising matches.
  • array_filter() preserves keys, call array_values() if you rely on numeric, contiguous indexes.
  • For very large datasets consider using generators (yield) or streaming approaches rather than loading everything into memory.

Summary table

Task Recommended approach
Single-match by column (one level) array_column() + array_search()
All matches with condition array_filter() (then array_values() if needed)
Complex/multi-field logic foreach with break/continue
Unknown depth search by key/value Recursive search function
Value exists anywhere Recursive inMultiArray() or in_array() for shallow arrays
Nabil Hassen
Nabil Hassen
Full Stack Web Developer

Stay Updated.

I'll you email you as soon as new, fresh content is published.

Thanks for subscribing to my blog.

Latest Posts