Search code examples
phpmultidimensional-arrayarray-filter

Filter a multidimensional array by multiple, required values regardless of keys


I have an multidimensional array and i'd like to filter by many values.

$datas = [
    [
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe',
        'gender' => 'male'
    ],
    [
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith',
        'gender' => 'female'
    ],
    [
        'id' => 5342,
        'first_name' => 'Jane',
        'last_name' => 'Doe',
        'gender' => 'female'
    ],
    [
        'id' => 5623,
        'first_name' => 'Peter',
        'last_name' => 'Doe',
        'gender' => 'male'
    ],
    [
        'id' => 7216,
        'first_name' => 'Mike',
        'last_name' => 'Lill',
        'gender' => 'male'
    ]
];

I have combined the methods of array_filter and array_search and got a good result but this only does the filtering of only one value. I'd like something like this...

array_filter(
    $datas,
    function ($key) {
        return array_search(['Doe', 'male'...], $key);
});

And its give

array(
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe',
        'gender' => 'male'
    ),
    array(
        'id' => 5623,
        'first_name' => 'Peter',
        'last_name' => 'Doe',
        'gender' => 'male'
    )
)

Solution

  • Of course you can simply loop any given input and check if a given element matches any criteria you implement:

    <?php
    $input = [
        [
            'id' => 2135,
            'first_name' => 'John',
            'last_name' => 'Doe',
            'gender' => 'male'
        ],
        [
            'id' => 3245,
            'first_name' => 'Sally',
            'last_name' => 'Smith',
            'gender' => 'female'
        ],
        [
            'id' => 5342,
            'first_name' => 'Jane',
            'last_name' => 'Doe',
            'gender' => 'female'
        ],
        [
            'id' => 5623,
            'first_name' => 'Peter',
            'last_name' => 'Doe',
            'gender' => 'male'
        ],
        [
            'id' => 7216,
            'first_name' => 'Mike',
            'last_name' => 'Lill',
            'gender' => 'male'
        ]
    ];
    
    $needles = ['Doe', 'male'];
    $output = [];
    array_walk($input, function($element) use ($needles, &$output) {
        $matches = true;
        foreach ($needles as $needle) {
            if (!in_array($needle, $element)) {
                $matches = false;
            }
        }
        if ($matches) {
            $output[] = $element;
        }
    });
    
    print_r($output);
    

    The obvious output is:

    Array
    (
        [0] => Array
            (
                [id] => 2135
                [first_name] => John
                [last_name] => Doe
                [gender] => male
            )
    
        [1] => Array
            (
                [id] => 5623
                [first_name] => Peter
                [last_name] => Doe
                [gender] => male
            )
    
    )