排序复杂php数组
我的服务器上有一个cronjobs数组,我需要按它们启动的日期进行排序,起始数组是:排序复杂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
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);