2011-06-16 88 views
0

在python數組排序我有一個很完善的情況如下:自創建字母

list = [('wr', ['A1']), ('wr-qA', ['A3']), ('wr,w', ['A4']), ('wr-mw', ['A2']), ('wrs', ['A6']), ('wrD', ['A8']), ('wrS', ['A7']), ('wr.w', ['A5']), ('=k', ['A10']), ('Dd', ['A9'])] 

alphabet = " -,.AjawbpfmnrhHxXsSqkgtTdD=/()[]<>{}'*#I1234567890&@" 

Sorted_list = sorted(list, key=lambda (v, k): [alphabet.index(c) for c in v]) 
print Sorted_list 


Output = [('wr', ['A1']), ('wr-mw', ['A2']), ('wr-qA', ['A3']), ('wr,w', ['A4']), ('wr.w', ['A5']), ('wrs', ['A6']), ('wrS', ['A7']), ('wrD', ['A8']), ('Dd', ['A9']), ('=k', ['A10'])] 

我如何可以做同樣的PHP中:

$list = array('wr' => 'A1', 'wr-qA' => 'A3', 'wr,w' => 'A4', 'wr-mw' => 'A2', 'wrs' => 'A6', 'wrD' => 'A8', 'wrS' => 'A7', 'wr.w' => 'A5', '=k' => 'A10', 'Dd' => 'A9'); 
+0

PHP中的數組是什麼? – 2011-06-16 09:40:33

+0

用作鍵的字符串是不同書寫文字的轉錄。根據給定的字母排序它們會給你一個詞典。 – Preys 2011-06-16 09:49:37

+0

您還在使用Python中的元組列表,但在PHP中使用哈希列表?這是打算? – 2011-06-16 09:51:08

回答

4

我不完全理解你的問題,但如果你需要在PHP中進行自定義排序,你需要使用usortuasort。可能是第二個,因爲我看到你有陣列中的自定義鍵。

如果您足夠幸運並且可以使用PHP 5.3,則可以將回調提供爲a closure

這將是PHP中用戶排序的等價物。在PHP中相當於indexOf將是strpos

警告:在比較strpos的返回值時要小心,因爲如果找不到匹配項,它可能會返回false。並且在PHP false中等於(==)至0


關於PHP中的列表結構。也許你需要這樣的東西。

$list = array(array('wr', array('A1')), array('wr-qA',array('A3')), ...); 

雖然不確定。

+0

OH MY GOD。 PHP終於關閉了。在Java之前,倒數第二,這是一個成就,對吧? – 2011-06-16 09:51:35

+0

@Dhaivat由於匿名類聲明,Java不需要像PHP一樣關閉閉包,所以它純粹是語法。在PHP中,你必須用一個字符串的名字來引用一個函數,其中閉包是向前邁出的一大步。 – 2011-06-16 10:02:27

+0

爲什麼要創建數組('A1')等等,肩數組('wr','A1')就夠了? – 2011-06-16 10:04:00

1

對於拉姆達排序,可以使用usort(...)(和strcmp()用於比較)

usort($list, "strcmp"); // PHP function name as a string 

由於PHP 5.3也可以使用匿名函數作爲回調參數

usort($list, function($a, $b) { return strcmp($a, $b) }); 
// Note - callback function must return integer comparison between 2 elements 

然而,如果按價值排序,您可以簡單地使用sort()或者如果您按鍵排序,請使用ksort()(請注意,它們排序並返回一個布爾標誌)

0

這就是我想出來的。它使用uksort(),它接受用戶定義的排序函數並根據它們的鍵對元素進行排序(這正是您所需要的)。

該代碼可能需要一點調整,但我試過了,它的工作原理。在調用uksort()之後,$list變量將包含排序的數組。在這個代碼示例中,我使用了一個Anonymous function作爲排序函數,它可以從PHP 5.3中獲得,在此之前,您可以使用一個簡單的函數(例如,您可以檢查前面鏈接的uksort()引用)。

$list = array('wr' => 'A1', 'wr-qA' => 'A3', 'wr,w' => 'A4', 'wr-mw' => 'A2', 'wrs' => 'A6', 'wrD' => 'A8', 'wrS' => 'A7', 'wr.w' => 'A5', '=k' => 'A10', 'Dd' => 'A9'); 
$alphabet = " -,.AjawbpfmnrhHxXsSqkgtTdD=/()[]<>{}'*#I1234567890&@"; 

uksort($list, function ($a, $b) use ($alphabet) { 
    $shorter=min($a, $b); 
    $len=strlen($shorter); 
    for ($i=0, $len=strlen($shorter); $i < $len; $i++) { 
     $aval=strpos($alphabet, $a[$i]); 
     $bval=strpos($alphabet, $b[$i]); 
     if ($aval!=$bval) { 
      return $aval > $bval ? 1 : -1; 
     } 
    } 
    return $shorter==$b ? 1 : -1; 
}); 

編輯:我很快就寫了一個版本,而匿名函數:

$list = array('wr' => 'A1', 'wr-qA' => 'A3', 'wr,w' => 'A4', 'wr-mw' => 'A2', 'wrs' => 'A6', 'wrD' => 'A8', 'wrS' => 'A7', 'wr.w' => 'A5', '=k' => 'A10', 'Dd' => 'A9'); 

function alphabet_sorter($a, $b) { 
    $alphabet = " -,.AjawbpfmnrhHxXsSqkgtTdD=/()[]<>{}'*#I1234567890&@"; 

    $shorter=min($a, $b); 
    $len=strlen($shorter); 
    for ($i=0, $len=strlen($shorter); $i < $len; $i++) { 
     $aval=strpos($alphabet, $a[$i]); 
     $bval=strpos($alphabet, $b[$i]); 
     if ($aval!=$bval) { 
      return $aval > $bval ? 1 : -1; 
     } 
    } 
    return $shorter==$b ? 1 : -1; 
} 

uksort($list, 'alphabet_sorter'); 
+0

我有'使用($字母)'的問題。這是因爲我的PHP版本? – Preys 2011-06-16 11:23:41

+0

@Preys適合我。什麼是你的PHP版本?如果它至少爲5.3,則應該在調用uksort之前以某種方式顯示代碼(可能使用http://pastebin.com/)。 – kapa 2011-06-16 11:25:39

+0

@Preys不支持匿名函數。我會很快爲你重寫這個。 – kapa 2011-06-16 14:30:49