2014-11-24 34 views
0

我想基於CRITICALWARNINGINFO子字符串進行排序PHP數組,然後CRITICALWARNINGINFO子陣列應該再次戳值包含在每個時間排序按照順序排列的字符串。 基本上最後我需要陣列與CRITICAL 1日進行排序與​​時間戳進行排序,然後WARNING然後INFO等..排序PHP數組有兩個子

+0

沒有什麼明確的.... – Naincy 2014-11-24 06:47:05

+0

請提供您的陣列格式 – 2014-11-24 06:49:00

+0

$鍵= (array_keys($ eventinfo [ 「消息」])); ($ i = 0; $ i ". $key.":
」。$ arrTmp [$ tmp]; } $ tmp ++; } } $ result_str = events_print($ cumltvArray); $ cumltvArray是我通過events_print – kkr 2014-11-24 07:08:07

回答

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

在但這隻能如果排序每行都有非空格,我的意思是單個單詞。

想知道其他解決方案嗎?

1

首先,定義一個函數將一行的緊急性轉化爲一個數字。然後,假設數組中的每個元素包含文件的一行,則需要應用裝飾器以保持排序穩定;又見my earlier answer關於這個問題:

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

傑克,你能解釋你的代碼的最後部分的syntaxt? usort部分。從未見過用這種方式編寫的PHP。函數($ a,$ b)做什麼?這是如何工作的?我也不理解你的回報聲明。在此先感謝:) – Bolli 2014-11-24 07:00:39

+1

@Bolli我正在使用[匿名函數](http://php.net/manual/en/functions.anonymous.php)。 – 2014-11-24 07:05:09

+0

謝謝!很好的答案! – Bolli 2014-11-24 07:12:02