Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
排序复杂php数组_Php_Arrays_Sorting_Cron - Fatal编程技术网

排序复杂php数组

排序复杂php数组,php,arrays,sorting,cron,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 1

我的服务器上有一个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
有人能告诉我实现这一目标需要走的方向吗

谢谢您的时间。

这个怎么样

$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)));

在这里,我用
子字符串
删除了字符串的其余部分;我认为这样更有效率。不过,展示如何使用正则表达式实现这一点也可能很有用。))

我认为您可能需要编写一个函数来比较每一行,然后使用该函数对数组进行排序。数组值都是字符串,对吗?使用
usort
,定义您自己的排序规则。数组中的每个条目都是字符串,是的。在usort的情况下,我如何定义一个规则,可以按照字符串中的第四组->第三组->第二组->第一组数字对这些字符串进行排序?一个简单的
strcmp
+
usort
就可以了。到目前为止你试过什么?事实上,我想要的是顶部的最小值。这些都是日期(以一种非常奇怪的格式),我想从最早->最晚开始排序,而且第一和第二个是分钟和小时,你的排序写的比08早11个-这稍微有点错误,尽管非常接近我需要的。这可能会使解释更简单,足够真实。。编辑以显示所需的输出。更新了我的答案;正如我所说,它只是使用了strcmp($f,$s)
而不是
strcmp($s,$f)
-strcmp($s,$f)
也应该这样做)。我是个傻瓜,这完全超出了我对strcmp($f,$s)的理解。很抱歉。。非常感谢你的帮助,它现在工作得很好!
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);