在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
输出:
[('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'
);
我不完全理解您的问题,但如果您需要在PHP中进行自定义排序,则需要使用usort
或uasort
。可能是第二个,正如我所看到的,您的数组中有自定义键。
如果你足够幸运,并且可以使用PHP 5.3,那么你可以提供回调作为闭包。
这在PHP中相当于用户排序。在PHP中indexOf
的等价物是strpos
。
警告:比较strpos
的返回值时要小心,因为如果找不到任何匹配项,它可能会返回false
。并且在PHP中false
等于(==
)0
关于PHP中的列表结构。也许你需要这样的东西。
$list = array(array('wr', array('A1')), array('wr-qA',array('A3')), ...);
但不确定。
对于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()
(请注意,它们在适当位置排序,并且只返回布尔标志)
这就是我想到的。它使用uksort()
,它采用用户定义的排序函数,并根据元素的键对元素进行排序(这似乎是您所需要的)。
代码可能需要一些调整,但我试过了,它确实有效。调用uksort()
之后,$list
变量将包含已排序的数组。
在这个代码示例中,我使用了一个Anonymous函数作为排序函数,它可以从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');
使用与我对您前面问题的回答完全相同的uksort()
函数,您只需要扩展翻译字符串,就可以对自定义字母表中的非空格字母使用大写和小写字母。我从两个翻译字符串中提取了空格,因为它们都在第一个位置,翻译毫无意义。
代码:(演示)
$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',
)