Как отфильтровать и отсортировать массив на основе наиболее важных значений?

1

Предположим, у меня есть массив, который находится ниже:

Array
(
    [0] => Array
        (
            [name] => playstation sony 3 slim 320gb
        )

    [1] => Array
        (
            [name] => sony xperia acro s
        )

    [2] => Array
        (
            [name] => sony xperia tipo
        )

    [3] => Array
        (
            [name] => sony ericsson xperia arc s
        )

    [4] => Array
        (
            [name] => sony xperia go
        )

    [5] => Array
        (
            [name] => sony playstation 4
        )

)

Теперь я хочу отфильтровать массив на основе значения поиска и отсортировать массив на основе наиболее релевантных (по кратчайшей).

Мои данные запроса:

 $request = 'sony';

Я ожидаю следующих результатов:

 Array
(
    [0] => Array
        (
            [name] => sony xperia go
        )

    [1] => Array
        (
            [name] => sony xperia tipo
        )

    [2] => Array
        (
            [name] => sony playstation 4
        )

    [3] => Array
        (
            [name] => sony xperia sony acro ss
        )

    [4] => Array
        (
            [name] => sony ericsson xperia arc s
        )

    [5] => Array
        (
            [name] => playstation Sony 3 slim 320gb
        )

)
  • 3
    Как это возможно в PHP - Да, это возможно. Что вы пробовали?
  • 2
    Кстати, вы объявили массив с теми же ключами.
Показать ещё 15 комментариев
Теги:
arrays
sorting

1 ответ

3
Лучший ответ

Самый простой способ добиться фильтрации поиска в PHP - это фильтровать массив ( array_filter) вашим пользовательским обратным вызовом, а затем сортировать его с помощью пользовательской функции сравнения ( usort).

Вот простой код:

<?php 
$data[]['name'] = 'foo';
$data[]['name'] = 'playstation sony 3 slim 320gb';
$data[]['name'] = 'sony xperia acro s';
$data[]['name'] = 'sony xperia tipo';
$data[]['name'] = 'sony ericsson xperia arc s';
$data[]['name'] = 'sony xperia go';
$data[]['name'] = 'sony playstation 4';
$data[]['name'] = 'bar';

$result = array_filter($data, function($v) { return stristr(current($v), 'sony'); });
usort($result, function($a, $b) { return strlen(current($a)) < strlen(current($b)) ? -1 : 1; });
print_r($result);

Обратите внимание, что PHP не является хорошим решением для реализации сложных требований к поиску. Поэтому для более ориентированных на поиск решений, пожалуйста, рассмотрите возможность использования:

которые могут быть легко интегрированы с PHP.

  • 1
    большое спасибо за ваш отличный ответ :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню