簡體   English   中英

用兩個子字符串對PHP字符串(行)數組進行排序

[英]Sort PHP array of string (line) with two substring

我想基於CRITICALWARNINGINFO子字符串對php數組進行排序,然后再對CRITICALWARNINGINFO子數組進行排序,並按升序將字符串的每一行中包含的時間戳記值進行排序。 基本上,最后我需要使用CRITICAL 1st對數組進行排序,對時間戳進行排序,然后對WARNING進行排序,然后對INFO進行排序。

首先,定義一個函數,將線的緊迫性轉化為數字。

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

但這只能在每行都有非空格的情況下進行排序,我的意思是單個單詞。

還有其他想知道的解決方案嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM