2014-11-24 115 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