用自己创建的字母排序数组

时间:2011-06-16 09:36:12

标签: php python arrays sorting

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

4 个答案:

答案 0 :(得分: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')), ...);

不确定。

答案 1 :(得分:1)

对于lambda排序,您可以使用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()(请注意,它们按比例排序并仅返回布尔标志)

答案 2 :(得分: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');

答案 3 :(得分:0)

使用与 my answeryour earlier question 完全相同的 uksort() 函数,您只需要将翻译字符串扩展为对自定义字母表中的非空格字母使用大写和小写字母.我从两个翻译字符串中去掉了空格,因为它们都在第一个位置,翻译毫无意义。

代码:(Demo)

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

$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'
];

uksort(
    $list,
    function ($a, $b) use ($trans) {
        return strtr($a, ...$trans) <=> strtr($b, ...$trans);
    }
);

var_export($list);

输出:

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