这个怎么样?
$a = array(
'00 08 24 10 * 2012 curl --user user:pass command',
'00 09 24 10 * 2012 curl --user user:pass command',
'00 08 18 10 * 2012 curl --user user:pass command',
'00 11 18 10 * 2012 curl --user user:pass command',
);
usort($a, function($f, $s) {
$fx = implode('', array_reverse(preg_split('/\D+/', $f)));
$sx = implode('', array_reverse(preg_split('/\D+/', $s)));
return strcmp($fx, $sx);
});
var_dump($a);
/*
0 => string '00 08 18 10 * 2012 curl --user user:pass command' (length=48)
1 => string '00 11 18 10 * 2012 curl --user user:pass command' (length=48)
2 => string '00 08 24 10 * 2012 curl --user user:pass command' (length=48)
3 => string '00 09 24 10 * 2012 curl --user user:pass command' (length=48)
*/
我在这里所做的基本上是从所有有问题的字符串中提取所有数字部分,然后将它们反转为数字字符串,然后比较这些字符串。
这可以通过两种方式进行修改:首先,强化正则表达式,使其与命令本身的数字不匹配:
$fx = implode('', array_reverse(
preg_split('/(?<=\d{4}).+$|\D+/', $f)));
...其次,使用记忆功能:
function getSortCriteria($line) {
static $criterias = array();
if (! isset($criterias[$line])) {
$numbers = preg_split('/\D+/', substr($line, 0, 18));
$criterias[$line] = implode('', array_reverse($numbers));
}
return $criterias[$line];
}
usort($a, function($f, $s) {
return strcmp(getSortCriteria($f), getSortCriteria($s));
});
var_dump($a);
substring
在这里,我用;删除了字符串的其余部分。我认为它更有效。尽管如此,展示如何使用正则表达式完成此操作也可能很有用。))