首页 > 解决方案 > PHP:排序字符串

问题描述

我有一个这样的字符串:

{{14,2,53045,2,1,0,156,100,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53045,2,1,0,168,500,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1},
{14,2,53045,2,1,0,168,200,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1},
{14,2,53045,2,1,0,97,200,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,3,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0}}

但我喜欢让所有 8 行都按第 3 个、第 7 个和第 8 个值排序,所以结果是:

{{14,2,53139,2,1,0,467,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,3,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0
{14,2,53045,2,1,0,156,100,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53045,2,1,0,168,500,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1},
{14,2,53045,2,1,0,168,200,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1},
{14,2,53045,2,1,0,97,200,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0}}

有谁知道如何实现这一目标?

提前致谢,

安德烈亚斯

编辑:

SQLite 查询:

select owner, '{{' || 
    group_concat(
        event||','||parent||','||key||','||target||','||tick_count||','||tick_interval||','
        ||ifnull(arg1,'NULL')||','||ifnull(arg2,'NULL')||','||ifnull(arg3,'NULL')||','||ifnull(arg4,'NULL')||','
        ||ifnull(arg5,'NULL')||','||ifnull(arg6,'NULL')||','||ifnull(arg7,'NULL')||','||ifnull(arg8,'NULL')||','
        ||ifnull(arg9,'NULL')||','||ifnull(arg10,'NULL')||','||ifnull(arg11,'NULL')||','||ifnull(arg12,'NULL')||','
        ||ifnull(arg13,'NULL')||','||ifnull(arg14,'NULL')||','||ifnull(arg15,'NULL')||','||hasReq, '},{')||'}}' as key_value_pairs 
from items_functions    WHERE owner = 281201 group by owner

标签: php

解决方案


此代码将根据您的问题执行您所要求的操作(根据值 3 降序对字符串中的元素进行排序)。正如评论中所指出的,可能有很多更好的方法可以做到这一点,从重写查询开始。但是,如果不了解您是如何使用数据的,就很难说最好的重写方法是什么。

$data = '{{14,2,53045,2,1,0,156,100,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53045,2,1,0,168,500,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1},
{14,2,53045,2,1,0,168,200,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1},
{14,2,53045,2,1,0,97,200,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,3,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0}}';
$json = str_replace(array('{', '}', 'NULL'), array('[', ']', '"NULL"'), $data);
$arr = json_decode($json);
//print_r($arr);
// sort based on element 3 descending
usort($arr, function ($a, $b) { return - ($a[2] <=> $b[2]); });
//print_r($arr);
$json = json_encode($arr);
$data = str_replace(array('[', ']', '"NULL"'), array('{', '}', 'NULL'), $json);
print_r($data);

输出:

{{14,2,53139,2,1,0,467,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53139,2,1,0,467,3,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53045,2,1,0,156,100,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0},
{14,2,53045,2,1,0,168,500,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1},
{14,2,53045,2,1,0,168,200,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1},
{14,2,53045,2,1,0,97,200,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0}}

推荐阅读