When working with PHP arrays, you often need to filter out specific keys to get a subset of the original array. Whether you’re processing user data, working with API responses, or just tidying up an array, filtering by keys can be a useful technique to simplify and streamline your data.

In this post, we’ll cover an effective way to filter an array based on a set of desired keys. We’ll also explore a few different methods to achieve this, depending on your use case.

Scenario: Filtering an array by a list of keys

Let's say you have an array $data with various user details, but you only need certain fields, such as name and city. Instead of manually pulling out these values, we’ll leverage PHP’s array functions to quickly create a filtered array.

Example Data

<?php
$data = [
    'name' => 'Alice',
    'age' => 25,
    'city' => 'New York',
    'email' => 'alice@example.com'
];

$allowedKeys = ['name', 'city'];

In this example, $data holds information about a user, but we only want to keep the name and city keys, ignoring the rest.

Solution 1: array_intersect_key

The array_intersect_key function in PHP is perfect for this scenario. It compares the keys of one array with another and returns a new array containing only the keys present in both.

Here’s how to filter $data using array_intersect_key and array_flip:

<?php
$filteredData = array_intersect_key($data, array_flip($allowedKeys));

print_r($filteredData);

How it works

  1. Flipping the Keys: We first use array_flip on $allowedKeys. This turns the list of allowed keys into an associative array with the keys as values. So array_flip($allowedKeys) will look like:
    ['name' => true, 'city' => true];
    
  2. Intersecting Keys: We then pass the flipped array as the second parameter to array_intersect_key, which keeps only the keys in $data that are also in the flipped array.

Output

The resulting $filteredData array would look like this:

<?php
Array
(
    [name] => Alice
    [city] => New York
)

This solution is simple, efficient, and ideal when you just need to filter based on keys.


Solution 2: array_filter with a closure

If you need additional filtering logic—for instance, based on both keys and values—you might prefer using array_filter with a closure. This approach offers more flexibility, although it’s a bit more verbose.

<?php
$filteredData = array_filter(
    $data,
    fn($value, $key) => in_array($key, $allowedKeys),
    ARRAY_FILTER_USE_BOTH
);

print_r($filteredData);

How it works

  • Closure with array_filter: Here, we’re using a closure within array_filter to check if each key exists in $allowedKeys.
  • ARRAY_FILTER_USE_BOTH: Passing ARRAY_FILTER_USE_BOTH allows the closure to access both the key and value of each item in the array.

Output

As before, the output of this approach would be:

<?php
Array
(
    [name] => Alice
    [city] => New York
)

Which method to use?

  • If you just need to filter by keys: Go with array_intersect_key. It’s more concise and efficient.
  • If you need additional logic on both keys and values: Use array_filter with a closure, which gives you more control over what to include in the result.

Wrapping up

Filtering an array by keys in PHP is a straightforward task when you know the right functions to use. Whether you choose array_intersect_key or array_filter, both options provide clean and effective solutions to extract the data you need.