Фильтровать массив по нескольким значениям - PullRequest
0 голосов
/ 23 марта 2019

У меня есть многомерный массив, и я хотел бы отфильтровать по многим значениям.

$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'
    ]
];

Я объединил методы array_filter и array_search и получил хороший результат, но это только фильтрация только одного значения. Я хотел бы что-то вроде этого ...

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

и его дают

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

1 Ответ

1 голос
/ 23 марта 2019

Конечно, вы можете просто зациклить любой заданный вход и проверить, соответствует ли данный элемент каким-либо критериям, которые вы реализуете:

<?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);

Очевидный вывод:

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
        )

)
...