我想根据
CRITICAL
、 WARNING
、INFO
子字符串对 php 数组进行排序,然后 CRITICAL
、 WARNING
、INFO
子数组应该使用每行中包含的时间戳值再次排序按升序排列的字符串。
基本上最后我需要用 CRITICAL
1st 对数组进行排序,然后按时间戳排序 WARNING
然后 INFO
依此类推..
$keys = array_keys($eventinfo["message"]);
for ($i = 0; $i < count($keys); $i++) {
$key = ($keys[$i]);
$perNode = $eventinfo["message"][$key];
$arrTmp = explode("\n", $perNode);
$t = count($arrTmp);
$tmp = 0;
while ($t) {
$t--;
if ($arrTmp[$tmp] != "") {
$cumltvArray[] = "<a href='#'>" . $key. "</a> : </br>".$arrTmp[$tmp];
}
$tmp++;
}
}
$result_str = events_print($cumltvArray);
// $cumltvArray is the one which I am passing to events_print
首先,定义一个函数,将线路的紧急程度转换为数字。
function urgency($line)
{
if (strpos($line, 'INFO') !== false) {
return 1;
} elseif (strpos($line, 'WARNING') !== false) {
return 2;
} elseif (strpos($line, 'CRITICAL') !== false) {
return 3;
}
return 0;
}
然后,假设数组的每个元素都包含文件的一行,您需要应用装饰器来保持排序稳定;另请参阅我之前关于该主题的回答:
array_walk($array, function(&$element, $index) {
$element = array($element, $index); // decorate
});
应用装饰器后,对数组进行排序;我正在使用稳定的比较助手:
function stablecmp($fn)
{
return function($a, $b) use ($fn) {
if (($tmp = call_user_func($fn, $a[0], $b[0])) != 0) {
return $tmp;
} else {
return $a[1] - $b[1];
}
};
}
usort($array, stablecmp(function($a, $b) {
return urgency($b) - urgency($a);
}));
最后,取消修饰数组以产生最终结果:
array_walk($array, function(&$element) {
$element = $element[0];
});
对排序顺序变得至关重要
function my_cmp($a, $b){
$pieces_a = explode("CRITICAL", $a);
$pieces_b = explode("CRITICAL", $b);
if(!isset($pieces_a[1]) && isset($pieces_b[1])) {
return 1;
}
elseif(!isset($pieces_b[1]) && isset($pieces_a[1])) {
return -1;
}
elseif(!isset($pieces_a[1]) && !isset($pieces_b[1])) {
return 0;
}
return strcasecmp($pieces_a[1], $pieces_b[1]);
}
usort($arr, "my_cmp");
但是这只能在每行没有空格的情况下进行排序,我的意思是单个单词。
还有其他想知道的解决方案吗?