2010-09-24 162 views
0

我有數組,幷包含50個值,PHP排序數組偏好

例如

倫敦,bluehit,綠色,lonpark,ABC,AAB,隆塞

我想排序按我的喜好我給一個參數,

例如,如果我給arugment作爲LON然後我的數組應該形成像

倫敦,lonpark,隆塞,AAB,ABC,blurhit,綠色,隆塞,

所以在我上面的陣列輸出是我送給參數爲結腸,因此開始與我的偏好字符數組的值,然後按字母順序排列,

提醒,

對我來說,上述問題太複雜, bcoz我知道asort,ksort,asc只,這是

第一次是滿足這樣的要求。

+0

它是一個關聯數組?或多維? – 2010-09-24 12:36:57

+2

爲什麼lonsee在排序列表的末尾,以及在開始? – 2010-09-24 12:38:23

回答

2
  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); 
+0

是這種情況下敏感 – Bharanikumar 2010-09-24 13:18:13

+0

@Bharanikumar:看到更新 – user187291 2010-09-24 13:26:50

2

這會被問到很多。看看使用自定義排序功能。從php.net:uksort和。

+5

呵呵。有趣的是,使用名爲uksort()的函數將倫敦放在列表的頂部。 ;-) – Spudley 2010-09-24 12:40:14

+0

哈哈哈哈哈哈哈! (我只是輸入'lol',但我被字符限制挫敗了。) – Stephen 2010-09-24 14:03:11

1

你可以使用usort,你可以定義你自己的函數來排序數據。

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

對於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); 

(道歉行話)

+0

嗨,salathe,謝謝,有沒有函數調用use,bcoz在上面的函數中使用了use關鍵字, – Bharanikumar 2010-09-24 12:59:55

+0

Bharanikumar,'use '關鍵字用於允許匿名函數訪問正常範圍之外的變量(即閉包)。 – salathe 2010-09-24 13:06:09

+0

我執行上面的代碼,我得到解析錯誤在這一行返回函數($ a,$ b)使用($前綴),程序不允許我執行..獲取錯誤 – Bharanikumar 2010-09-24 13:09:12

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 
) 
**/