массив сортировки php с предпочтением - PullRequest
0 голосов
/ 24 сентября 2010

У меня есть массив и содержит 50 значений,

пример

Лондон, bluehit, зеленый, lonpark, азбука, ааЪ, Лонзее

Я хочу отсортировать в соответствии с моими предпочтениями, я даю один аргумент,

пример, если я даю arugment как lon, тогда мой массив должен выглядеть как

Лондон, Лонпарк, Лонси, AAB, ABC, Blurhit, зеленый, Лонси,

поэтому в приведенном выше выводе моего массива я дал параметр как lon, поэтому начал со своих значений массива символов, а затем в алфавитном порядке,

Посоветуйте,

Для меня вышеуказанный вопрос слишком сложный, потому что я знаю asort, ksort, только asc, это

в первый раз я удовлетворяю такого рода требованиям.

Ответы [ 5 ]

2 голосов
/ 24 сентября 2010
  1. заменить указанную строку символом с кодом 1
  2. сортировать нормально
  3. заменить символ обратно

вот оно;)

 $str = "lon";
 $a = array('london', 'bluehit', 'green', 'lonpark', 'abc', 'aab', 'lonsee');
 $b = preg_replace("~^$str~", "\x01", $a);
 sort($b);
 $b = preg_replace('~\x01~', "lon", $b);
 print_r($b);

upd: еще проще добавить к строке вместо "\ x01" вместо ее замены. Это также позволяет выполнять поиск без учета регистра или для сопоставления набора строк:

 $str = "lon";
 $a = array('london', 'bluehit', 'green', 'Lonpark', 'abc', 'aab', 'lonsee');
 $b = preg_replace("~^$str~i", "\x01$0", $a);
 sort($b);
 $b = str_replace('~\x01~', "", $b);
 print_r($b);
2 голосов
/ 24 сентября 2010

Как уже говорили другие, usort и сделанный на заказ компаратор подойдут хорошо. Вот пример, который имеет фабричную функцию (в данном случае функцию, которая возвращает функцию), которая генерирует компараторы (используя замыкания ) на основе требуемого префикса.

$subject = explode(',', 'london,bluehit,green,lonpark,abc,aab,lonsee');

function make_comparator($prefix)
{
    return function ($a, $b) use ($prefix) {
        if (strpos($a, $prefix) === 0 && strpos($b, $prefix) !== 0) {
            // $a starts with $prefix (and $b does not), sift up
            return -1;
        } elseif (strpos($a, $prefix) !== 0 && strpos($b, $prefix) === 0) {
            // $b starts with $prefix (and $a does not), sift down
            return 1;
        } else {
            // Otherwise, do a normal string comparison
            return strcmp($a, $b);
        }
    };
}

$sorted = $subject;
usort($sorted, make_comparator('lon'));
var_dump($sorted);

Для версий PHP ниже 5.3.0 (требуется выше) вы можете сделать что-то похожее:

function prefix_comparator($a, $b, $prefix) {
    if (strpos($a, $prefix) === 0 && strpos($b, $prefix) !== 0) {
        // $a starts with $prefix (and $b does not), sift up
        return -1;
    } elseif (strpos($a, $prefix) !== 0 && strpos($b, $prefix) === 0) {
        // $b starts with $prefix (and $a does not), sift down
        return 1;
    } else {
        // Otherwise, do a normal string comparison
        return strcmp($a, $b);
    }
}

$sort_by_lon = create_function('$a, $b', 'return prefix_comparator($a, $b, "lon");');
$sorted = $subject;
usort($sorted, $sort_by_lon);
var_dump($sorted);

(извинения за жаргон)

2 голосов
/ 24 сентября 2010

Об этом часто спрашивают.Взгляните на использование пользовательской функции сортировки.С php.net: uksort и usort .

1 голос
/ 24 сентября 2010

Вы можете использовать usort , вы можете определить свою собственную функцию для сортировки данных.

0 голосов
/ 24 сентября 2010

Вот еще одна возможность для вер. 5,3 +:

function pref_sort($arr, $pref, $case_insensitive = true)
{
    $case_insensitive ? natcasesort($arr) : sort($arr);        
    $pref_arr = array_filter($arr, 
        function($val) use ($pref){
            return (strpos(strtolower($val), strtolower($pref)) === 0);
        });
    return array_values($pref_arr + array_diff($arr, $pref_arr));
}

Использование:

$pref_str = 'lon';
$array = array('green', 'Lonpark', 'london', 'bluehit', 'abc', 
               'aab', 'lonsee', 'lon', 'Lon', 'Aab');

// Case-insensitive:
$sorted_array = pref_sort($array, $pref_str);
print_r($sorted_array);
/**
Array
(
    [0] => lon
    [1] => Lon
    [2] => london
    [3] => Lonpark
    [4] => lonsee
    [5] => Aab
    [6] => aab
    [7] => abc
    [8] => bluehit
    [9] => green
)
**/ 

// Case-sensitive:
$sorted_array = pref_sort($array, $pref_str, false);
print_r($sorted_array);
/**
Array
(
    [0] => Lon
    [1] => Lonpark
    [2] => lon
    [3] => london
    [4] => lonsee
    [5] => Aab
    [6] => aab
    [7] => abc
    [8] => bluehit
    [9] => green
)
**/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...