PHP. Поиск в многомерном массиве

Поиск в многомерном массиве средствами php.

PHP. Поиск в многомерном массиве


Представим ситуацию, когда у вас есть массив, в нем необходимо найти элементы массива, которые удовлетворяют некому условию.
Предположим, что наша задача кроется в том, что нужно пройтись по массиву и найти только те элементы, у которых ключ count равен 6.
Казалось бы, какие тут могут быть проблемы? Используем foreach и делов...

<?php
$array = [
        [
            'title' => 'hello',    
            'description' => 'its',
            'count' => 2
        ],
        [
            'title' => 'its me',    
            'description' => 'just',
            'count' => 4
        ],
        [
            'title' => 'pacificsky.ru',
            'description' => 'description',
            'count' => 6
        ],
        [
            'title' => 'google',
            'description' => 'search',
            'count' => 8
        ],
        [
            'title' => 'ps',
            'description' => 'recipes programming',
            'count' => 6
        ],
        [
            'title' => 'pacificsky',
            'description' => 'recipes programming',
            'count' => 6
        ],
        [
            'title' => 'yandex',
            'description' => 'search',
            'count' => 8
        ]
    ];
    
    $result = [];
    
    foreach($array as $val) {
        if ($val['count'] === 6) {
            $result[] = $val;
        }
    }
    var_dump($result);


Результат:

array(3) {
[0]=>
array(3) {
["title"]=>
string(13) "pacificsky.ru"
["description"]=>
string(11) "description"
["count"]=>
int(6)
}
[1]=>
array(3) {
["title"]=>
string(2) "ps"
["description"]=>
string(19) "recipes programming"
["count"]=>
int(6)
}
[2]=>
array(3) {
["title"]=>
string(10) "pacificsky"
["description"]=>
string(19) "recipes programming"
["count"]=>
int(6)
}
}


Судя по результату нас все вроде бы должно удовлетворять. Мы получили, то что хотели.
Я не исключаю, что можно пользоваться данной реализацией без каких ли было бы то проблем, но хотел бы вас познакомить еще с одной возможностью поиска в многомерном массиве:

<?php
$array = [
        [
            'title' => 'hello',    
            'description' => 'its',
            'count' => 2
        ],
        [
            'title' => 'its me',    
            'description' => 'just',
            'count' => 4
        ],
        [
            'title' => 'pacificsky.ru',
            'description' => 'description',
            'count' => 6
        ],
        [
            'title' => 'google',
            'description' => 'search',
            'count' => 8
        ],
        [
            'title' => 'ps',
            'description' => 'recipes programming',
            'count' => 6
        ],
        [
            'title' => 'pacificsky',
            'description' => 'recipes programming',
            'count' => 6
        ],
        [
            'title' => 'yandex',
            'description' => 'search',
            'count' => 8
        ]
    ];
    
    $result = array_filter($array, function($k) {
        return $k['count'] === 6;
    });
    var_dump($result);


Результат:

array(3) {
[0]=>
array(3) {
["title"]=>
string(13) "pacificsky.ru"
["description"]=>
string(11) "description"
["count"]=>
int(6)
}
[1]=>
array(3) {
["title"]=>
string(2) "ps"
["description"]=>
string(19) "recipes programming"
["count"]=>
int(6)
}
[2]=>
array(3) {
["title"]=>
string(10) "pacificsky"
["description"]=>
string(19) "recipes programming"
["count"]=>
int(6)
}
}


В данном примере я воспользовался встроенной функцией php - array_filter();
Функция array_filter — фильтрует элементы массива с помощью callback-функции.
Первым параметров в данной функции указываем массив. а вторым параметром указываем анонимную функцию , которая возвращает нам только те элементы массива, которые удовлетворяют нашему условию (конечно мы можем создать свой метод для второго параметра и использовать его, но мне больше нравится данный вариант, по этому я показал его).

$result = array_filter($array, function($k) {


Заметьте, что функция принимает параметр $k. Данный параметр поочередно принимает каждый элемент массива $array, за счет callback(обратный вызов).
Таким образом следующей строкой кода у нас происходит проверка, на удовлетворение наших условий:
return $k['count'] === 6;


Если ключ count, равен 6, то функция должна вернуть нам данный элемент массива целиком и записать полученный результат в переменную $result, а элементы, которые не удовлетворяют условию, будут проигнорированы.

Таким образом мной было представлено 2 варианта поиска по многомерному массиву. Я не исключаю, что есть и другие возможности, просто пример с foreach очевиден, а пример с array_filter элегантен. Да и работать array_filter должен побыстрее, чем использование foreach.

Если у вас есть другие варианты, предлагайте, пишите в комментариях свои примеры.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика
  • Счетчик PR-CY.Rank
  • Рейтинг@Mail.ru