2011-06-14 124 views
4

我想在PHP中按鍵排序數組。但我使用的字母不是普通的英文字母,而是自己創建的字母。這可能嗎?如何通過自定義字母表對php中的數組進行排序?

我的字母是

$alphabet = "AjawbpfmnrhHxXsSqkgtTdD ="; 

數組是這樣的:

Array (
    [=k_0] => Array(
     [0] => DI.3,2 &dwA-nTr& @[email protected] 
     [1] => mA 
     [2] => =k 
     [3] => Sfj,t 
     [4] => =k 
     [5] => pXr 
     ) 
    [aA_2] => Array(
     [0] => DI.7,4 &dwA-nTr& @Hrw-smA-tA,[email protected] 
     [1] => snD 
     [2] => aA 
     [3] => Sfj,t 
     [4] => jt 
     [5] => jt,w 
     ) 
    [sqA_1] => Array(
     [0] => DI.6,18 &dwA-nTr& @[email protected] 
     [1] => ra 
     [2] => sqA 
     [3] => Sfj,t 
     [4] => =s 
     [5] => r 
     ) 
    ); 

,所以如果我跟着我的字母排序這個數組的關鍵[=k_0]陣列應該是在年底。

+0

你是什麼意思的自創字母?你如何繪製這些圖?你不需要一個整數來表示它嗎? – Pwnna 2011-06-14 21:49:55

+0

這樣的鍵的任何例子,也許? – patapizza 2011-06-14 21:50:10

+0

英文字母是$ alphabet =「AjawbpfmnrhHxXsSqkgtTdD」 – Preys 2011-06-14 22:28:45

回答

5

您可以使用usort()函數並提供您自己的排序邏輯。

查看php.net爲例。使用uksort而不是usort。見http://www.php.net/manual/en/function.uksort.php。謝謝@Darien!

稍微修改從php.net例子 - 原碼與$alphabet映射加入:

function cmp($a, $b) 
{ 
    // custom sort order - just swapps 2 and 3. 
    $alphabet = array (1 => 1, 2 => 3, 3 => 2, 4 => 4, 5 => 5, 6=> 6); 

    if ($alphabet[$a] == $alphabet[$b]) { 
     return 0; 
    } 
    return ($alphabet[$a] < $alphabet[$b]) ? -1 : 1; 
} 

$a = array(3 => 'c' , 2 => 'b', 5 => 'e', 6 => 'f', 1=>'a'); 
uksort($a, "cmp"); 

foreach ($a as $key => $value) { 
    echo "$key: $value\n"; 
} 
+0

這是一個答案? – 2011-06-14 21:52:20

+0

是 - OP具有不直接覆蓋常規功能的自定義要求。沒有詳細的信息,'usort'是一個很好的起點。 – Ryan 2011-06-14 21:53:38

+0

我想你的意思是['uksort()'](http://www.php.net/manual/en/function.uksort.php)。 @Oz:是的,我認爲是這樣,因爲另一種選擇 - 創建自定義區域設置 - 讓我覺得這是一種難以置信的努力/矯枉過正。 – Darien 2011-06-14 21:54:57

-3

參見此代碼:

<?php 

$arr = array('wr' => 1, 'wrS' => 6, 'wr,w' => 3, 'wr.w' => 4, 'wr-qA' => 2, 'wrs' => 5); 

function compare_by_alphabet(array $alphabet, $str1, $str2) 
{ 
    $l1 = strlen($str1); 
    $l2 = strlen($str2); 
    $c = min($l1, $l2); 

    for ($i = 0; $i < $c; $i++) 
    { 
     $s1 = $str1[$i]; 
     $s2 = $str2[$i]; 
     if ($s1===$s2) continue; 
     $i1 = array_search($s1, $alphabet); 
     if ($i1===false) continue; 
     $i2 = array_search($s2, $alphabet); 
     if ($i2===false) continue; 
     if ($i2===$i1) continue; 
     if ($i1 < $i2) return -1; 
     else return 1; 
    } 
    if ($l1 < $l2) return -1; 
    elseif ($l1 > $l2) return 1; 
    return 0; 
} 

function compare_keys_by_alphabet($a, $b) 
{ 
    static $alphabet = array('-', ',', '.', 'A', 'j', 'a', 'w', 'b', 'p', 'f', 'm', 'n', 'r', 'h', 'H', 'x', 'X', 's', 'S', 'q', '‌​k', 'g', 't', 'T', 'd', 'D', '=', '/', '(', ')', '[', ']', '<', '>', '{', '}', '\'', '*', '#', 'I', 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, '&', '@'); 
    return compare_by_alphabet($alphabet, $a, $b); 
} 

uksort($arr, 'compare_keys_by_alphabet'); 

print_r($arr); 

結果:

Array 
(
    [wr] => 1 
    [wr-qA] => 2 
    [wr,w] => 3 
    [wr.w] => 4 
    [wrs] => 5 
    [wrS] => 6 
) 
+0

@OZ你能解釋一下嗎?有數組:$ arr = array('wr'=> 1,'wrS'=> 6,'wr,w'=> 3,'wr.w'=> 4,'wr-qA'=> 2' wrs'=> 5); $ alphabet = array(' - ','\','。','A','j','a','w','b','p','f','m', 'N', 'R', 'H', 'H', 'X', 'X', 'S', 'S', 'q', 'K', 'G', 'T','T ','d','D','=','/','(',')','[',']','<','>','{','}','''' , '*', '#', '我',1,2,3,4,5,6,7,8,9,0, '&', '@');我得到的輸出是:Array('[wr.w] => 4','[wrs] => 5','[wr,w] => 3','[wr] => 1','[wr -qA] => 2','[wrS] => 6');但是用我的字母表我想要Array('[wr] => 1','[wr-qA] => 2','[wr,w] => 3','wr.w] => 4' '[wrs] => 5','[wrS] => 6') – Preys 2011-06-16 08:03:51

+0

@Preys,在你的評論中你寫了2個相同的數組:)只要按值排序第一個數組:'asort($ arr);'但是如果你想按VALUES排序,而不是按KEYS排序,你不需要任何字母,只需要'asort'函數。 – 2011-06-16 11:09:29

+0

曾與python,一定有我不明白在PHP中的東西;程序的結果應該是一個數組,它們是不同的數組。這些不同的數組必須在鍵的基礎上排序。所以你的程序把第一個數組「wr.w」=> 4;我想要的是第一個數組應該是「wr」=> 1;因爲基於字母表「wr」出現在「wr.w」之前,就像我們的字母表「鳥」出現在「鳥」之前一樣,不同數組(1或5或6)的值不會影響 – Preys 2011-06-16 12:39:40

0
鑑於

您的$alphabet = "AjawbpfmnrhHxXsSqkgtTdD";,並假設A < j < a等,根據您的評論,將備選字母表中的每個關鍵字轉換爲已知字母表中的一系列關鍵字,例如,使用像映射:

your alphabet: AjawbpfmnrhHxXsSqkgtTdD 
'real'alphabet: abcdefghijklmnopqrstuvw 

所以關鍵'Ajaw' => 'abcd''fmnr' => 'ghij'等,這然後將你的鑰匙到的東西,你可以進行排序使用傳統的PHP函數。儘管如此,您仍然需要一些方法來處理不存在於原始字母表中的字符。

類似這樣的東西可能會起作用 - 您需要兩個轉換功能(從字母表到「真實」字母表,反之亦然),然後使用比較器uksort

我的兩美分 - 謝謝澄清原來的問題。

+0

這似乎是可能的小文本,但是當處理大量文本時,這似乎是解決方案的一個很長的繞道。我在尋找的東西就像python中的下列內容:sorted_list = sorted(Unsorted_list,key = lambda(v,k): [alphabet.index(c)for c in v]) – Preys 2011-06-14 23:05:53

+0

我同意 - 這不是一個特別優雅的解決方案。 – Ryan 2011-06-14 23:15:19

+0

編譯自己PHP 6,它有內置的。 – hakre 2011-06-14 23:22:19

-1
<?php 
$arr = [8,10,12,18,20,7,4,6,2,20,0]; //take array 

$a= sortasc($arr); // call function 

function sortasc($arr){ 


    for($i=0;$i<=count($arr);$i++){ 
      for($j=1;$j<=count($arr)-1;$j++){ 

         if($arr[$j-1]>$arr[$j]){ 

         $temp = $arr[$j]; 
         $arr[$j]= $arr[$j-1]; 
         $arr[$j-1] = $temp; 
        } 
     } 
    } 
     return $arr; 
} 

?> 
相關問題