2

我的服务器上有一组 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

谁能指出我为实现这一目标而需要走的方向?

谢谢你的时间。

4

1 回答 1

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在这里,我用;删除了字符串的其余部分。我认为它更有效。尽管如此,展示如何使用正则表达式完成此操作也可能很有用。))

于 2012-09-26T11:03:57.590 回答