2011-06-14 84 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; 
} 

?> 
相关问题