Фильтр поиска в многомерном массиве в php - PullRequest
0 голосов
/ 09 февраля 2019

Как создать функцию поиска, которая выполняет поиск в многомерном вложенном массиве?

С учетом следующего массива:

Array
(
[0] => Array
    (
        [id] => 1
        [parent_name] => ACTIVITIES
        [children] => Array
            (
            )

    )

[1] => Array
    (
        [id] => 2
        [parent_name] => ANIMALS/PETS
        [children] => Array
            (
            )

    )

[2] => Array
    (
        [id] => 3
        [parent_name] => ART
        [children] => Array
            (
                [0] => Array
                    (
                        [post_id] => 100
                        [child_name] => Bookeeping
                        [painting] => Array
                            (
                                [0] => flower
                                [1] => beach
                                [2] => sunrise
                            )

                    )

                [1] => Array
                    (
                        [post_id] => 101
                        [child_name] => Addiction
                        [painting] => Array
                            (
                                [0] => sunrise
                                [1] => beach
                            )

                    )

            )

    )
[3] => Array
    (
        [id] => 4
        [parent_name] => Music
        [children] => Array
            (
                [0] => Array
                    (
                        [post_id] => 102
                        [child_name] => POP
                        [painting] => Array
                            (
                                [0] => suntown
                                [1] => beachfull
                                [2] => sunrise
                            )

                    )

                [1] => Array
                    (
                        [post_id] => 103
                        [child_name] => Rock
                        [painting] => Array
                            (
                                [0] => sunrisenew
                                [1] => beachnew
                            )

                    )

            )

    )
)

Как мне отфильтровать этот массив с помощью ключа, который выполняет поиск в 'painting '?

Например, ключом поиска является "sun"

Результат должен быть таким:

Array
(

[2] => Array
    (
        [id] => 3
        [parent_name] => ART
        [children] => Array
            (
                [0] => Array
                    (
                        [post_id] => 100
                        [child_name] => Bookeeping
                        [painting] => Array
                            (
                                [2] => sunrise
                            )

                    )

                [1] => Array
                    (
                        [post_id] => 101
                        [child_name] => Addiction
                        [painting] => Array
                            (
                                [0] => sunrise
                            )

                    )

            )

    )
[3] => Array
    (
        [id] => 4
        [parent_name] => Music
        [children] => Array
            (
                [0] => Array
                    (
                        [post_id] => 102
                        [child_name] => POP
                        [painting] => Array
                            (
                                [0] => suntown
                            )

                    )

                [1] => Array
                    (
                        [post_id] => 103
                        [child_name] => Rock
                        [painting] => Array
                            (
                                [0] => sunrisenew
                            )

                    )

            )

    )
)

1 Ответ

0 голосов
/ 09 февраля 2019
$needle = "sun";
$filteredArr = array_filter(
    $arr,
    function($v) use ($needle) {
        foreach($v['children'] as $child) {
            // "Version 1" of filtering, no "parts of strings" searches
            if (in_array($needle, $child['painting'])) {
                return true;
            }

            // "Version 2" of filtering, keyword may be part of a painting string
            foreach($child['painting'] as $painting) {
                if (strpos($painting, $needle) !== false) {
                    return true;
                }
            }
        }

        return false;
    }
);

Если вы используете функцию обратного вызова для array_filter (), тогда вы можете выполнять довольно сложные фильтрации.

Редактировать Новая версия ответа для удаления записей в массивах рисования, не соответствующихpattern.

Это работает, выполняя вложенные циклы foreach, вплоть до самого внутреннего необходимого массива, painting в этом случае.Массив painting фильтруется, поэтому все несоответствующие элементы в нем удаляются.Когда это сделано, на следующем уровне наружу проверяется массив painting , и, если он пуст, тип удаления "распространяется наружу".Таким образом, должны быть оставлены только записи с соответствующими записями рисования, и они должны быть как бы масштабируемыми.

Ссылки не являются строго необходимыми, вместо этого можно добавить переменные ключа массива в циклы foreach.Но мне не понравилась вся эта индексация.

$needle = 'sun';

foreach($arr as $entryKey => &$entry) {
    foreach($entry['children'] as $childKey => &$child) {
        foreach($child['painting'] as $paintingKey => $painting) {
            if (strpos($painting, $needle) === false) {
                unset($child['painting'][$paintingKey]);
            }
        }

        if (empty($child['painting'])) {
            unset($entry['children'][$childKey]);
        }
    }

    if (empty($entry['children'])) {
        unset($arr[$entryKey]);
    }
}
unset($entry, $child); // Take no risks with references
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...