これはどう?
$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)
*/
ここで行ったことは、基本的に、問題のすべての文字列からすべての数値部分を抽出し、それらを数値文字列に反転してから、これらの文字列を比較することです。
これは2つの方法で変更できます。1つは、コマンド自体の数値と一致しないように正規表現を強化することです。
$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
ここで、残りの文字列を;で削除しました。より効率的だと思います。それでも、これを正規表現でどのように実行できるかを示すことも役立つ場合があります。))