首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用两个子字符串对PHP字符串(行)数组进行排序

使用两个子字符串对PHP字符串(行)数组进行排序
EN

Stack Overflow用户
提问于 2014-11-24 14:39:35
回答 2查看 178关注 0票数 0

我想根据CRITICALWARNINGINFO子字符串对php数组进行排序,然后再对CRITICALWARNINGINFO子数组进行排序,并将每行字符串中包含的时间戳值按递增顺序排序。基本上在最后,我需要用CRITICAL排序数组,首先用时间戳排序,然后是WARNING,然后是INFO,依此类推。

EN

回答 2

Stack Overflow用户

发布于 2014-11-24 14:56:39

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

代码语言:javascript
复制
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;
}

然后,假设数组的每个元素都包含文件的一行,您需要应用一个装饰器来保持排序的稳定性;另请参阅关于这个主题的my earlier answer

代码语言:javascript
复制
array_walk($array, function(&$element, $index) {
    $element = array($element, $index); // decorate
});

在应用装饰器之后,对数组进行排序;我使用了一个稳定的比较助手:

代码语言:javascript
复制
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);
}));

最后,取消对数组的修饰以生成最终结果:

代码语言:javascript
复制
array_walk($array, function(&$element) {
    $element = $element[0];
});
票数 1
EN

Stack Overflow用户

发布于 2014-11-24 14:49:28

在排序后的订单上获得批判性

代码语言:javascript
复制
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");

但这只能在每行没有空格的情况下进行排序,我是指单个单词。

有没有什么其他的解决方案想知道?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27099174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档