具有首选项的php排序数组

时间:2010-09-24 12:34:32

标签: php arrays sorting

我有数组,包含50个值,

示例

伦敦,bluehit,绿色,lonpark,ABC,AAB,隆塞

我想根据自己的喜好排序,我给出一个论点,

例如,如果我将lug作为lon,那么我的数组应该像

那样形成

伦敦,lonpark,lonsee,aab,abc,blurhit,green,lonsee,

所以在上面我的数组输出是我给参数作为lon,所以从我的首选字符数组值开始,然后按字母顺序,

建议,

对我来说上面的问题太复杂了,bcoz我知道asort,ksort,asc only,这是

第一次满足这种要求。

5 个答案:

答案 0 :(得分:2)

这被问了很多。看一下使用自定义排序功能。来自php.net:uksortusort

答案 1 :(得分:2)

正如其他人所说,usort和定制的比较器很合适。这是一个具有工厂函数的示例(在本例中,是一个返回函数的函数),它根据所需的前缀生成比较器(使用closures)。

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

对于低于5.3.0的PHP版本(上面要求),您可以执行类似的操作:

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 :(得分:2)

  1. 使用代码为1
  2. 的字符替换相关字符串
  3. 通常排序
  4. 将角色替换回来
  5. 这就是它;)

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

答案 3 :(得分:1)

您可以使用usort,您可以定义自己的数据排序功能。

答案 4 :(得分:0)

这是ver的另一种可能性。 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
)
**/