2011-06-16 55 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