我的服务器上有一系列cronjobs,我需要根据它们触发的日期排序,起始数组是:
Array (
[0] => 00 08 24 10 * 2012 curl --user user:pass command
[1] => 00 09 24 10 * 2012 curl --user user:pass command
[2] => 00 08 18 10 * 2012 curl --user user:pass command
[3] => 00 11 18 10 * 2012 curl --user user:pass command
)
我想在我的网站上的表格中显示此列表,但按月,日,小时,分钟排序。
所需的输出是:
Array(
[0] => 00 08 18 10 * 2012 curl --user user:pass command
[1] => 00 11 18 10 * 2012 curl --user user:pass command
[2] => 00 08 24 10 * 2012 curl --user user:pass command
[3] => 00 09 24 10 * 2012 curl --user user:pass command
为了达到这个目的,有人能指出我需要走的方向吗?
感谢您的时间。
答案 0 :(得分:1)
这个怎么样?
$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
删除了其余的字符串;我觉得它效率更高。尽管如此,展示如何使用正则表达式完成此操作可能也很有用。 ))