PHP数组的字符串(行)与两个子字符串排序

4dc9hkyq  于 2023-10-15  发布在  PHP
关注(0)|答案(2)|浏览(120)

我想根据CRITICALWARNINGINFO子字符串对php数组进行排序,然后CRITICALWARNINGINFO子数组应该再次排序,其中每行字符串中包含的时间戳值按acsending顺序排列。基本上,在最后我需要数组进行排序与CRITICAL第一次与时间戳排序,然后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
vaqhlq81

vaqhlq811#

首先,定义一个函数,将行的紧急程度转换为数字。

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];
});
u0njafvf

u0njafvf2#

在排序顺序上变得至关重要

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

但这只能排序,如果每一行都没有空格,我的意思是单个单词,。
还有其他好奇的解决方案吗?

相关问题