排序复杂的php数组

时间:2012-09-26 10:54:03

标签: php arrays sorting cron

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

为了达到这个目的,有人能指出我需要走的方向吗?

感谢您的时间。

1 个答案:

答案 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删除了其余的字符串;我觉得它效率更高。尽管如此,展示如何使用正则表达式完成此操作可能也很有用。 ))