我有数组,包含50个值,
示例
伦敦,bluehit,绿色,lonpark,ABC,AAB,隆塞
我想根据自己的喜好排序,我给出一个论点,
例如,如果我将lug作为lon,那么我的数组应该像
那样形成伦敦,lonpark,lonsee,aab,abc,blurhit,green,lonsee,
所以在上面我的数组输出是我给参数作为lon,所以从我的首选字符数组值开始,然后按字母顺序,
建议,
对我来说上面的问题太复杂了,bcoz我知道asort,ksort,asc only,这是
第一次满足这种要求。
答案 0 :(得分:2)
答案 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)
这就是它;)
$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
)
**/