php - 如何更改较大字符串中子字符串的顺序?

标签 php mysql string

这相当令人困惑,但我会尽力解释......

我有一个充满字符串的 MYSQL 表,如下所示:

{3}12{2}3{5}52    

{3}7{2}44    

{3}15{2}2{4}132{5}52{6}22

{3}15{2}3{4}168{5}52

每个字符串都是产品选项和选项值的组合。 { } 中的数字是选项,例如 {3} = 颜色。紧跟在每个 { } 数字之后的数字是该选项的值,例如 12 = Blue。我已经有了知道如何解析这些字符串并正确传递信息的 PHP 代码,但有一个异常(exception):由于可能太复杂而无法进入此处的原因,选项的顺序需要为 3,4,2,5,6。 (尝试修改系统的其余部分以接受当前订单将是一项艰巨的任务。)如果特定组合没有所有五个选项也没关系,例如“{3}7{2}44”提供预期的结果。问题仅在于包含选项 2 和选项 4 的组合——需要切换它们的顺序,以便包含选项 2 和 4 的任何组合、{4} 及其对应值出现在 {2} 之前并且它对应值(value)。

我已尝试将列导入 Excel 并使用“文本到列”,通过“{”和“}”字符将它们分开并重新排序列,但由于并非每个字符串都会产生相同数量的列,顺序在其他方面变得困惑(比如选项 5 在选项 2 之前)。

我还尝试过使用 PHP 将每个字符串分解成一个数组(我想我可以重新排序),使用“}”作为分隔符,但我也没有运气,因为数字混合了以其他方式组合在一起,使它们无法使用。

TL;DR:我有一堆像上面引用的那样的字符串。在同时包含“{2}”和“{4}”的每个字符串中,需要调换这两个值的位置,以便 {4} 和它后面的数字出现在 {2} 之前以及它后面的数字。换句话说:

{3}15{2}3{4}168{5}52 

需要成为

{3}15{4}168{2}3{5}52

在伪代码中,我能找到的最接近的解决方案是:

for each string,
  if "{4}" is present in this string AND "{2}" is present in this string,
     take the "{4}" and every digit that follows it UNTIL you hit another "{" and store that substring as a variable, then remove it from the string.
     then, insert that substring back into the string, at a position starting immediately before the "{2}".

我希望这有某种意义......

是否有 任何 PHP、Excel、Notepad++、正则表达式等方法可以让我做到这一点?任何帮助将不胜感激。

编辑添加:在几个人发布了我尝试过的解决方案之后,我意识到提及我的主机正在运行 PHP 5.2.17 是至关重要的,它似乎不允许使用自定义排序进行 usort。如果我能给每个人的解决方案投票(所有这些我都在 PHP 沙盒中尝试过并且都有效),我会的,但我的代表太低了。

最佳答案

这样的东西对你有什么用。前 9 行只是将您的字符串转换为一个数组,每个元素都是一个选项编号和值的数组。 Order 建立了项目出现的顺序,最后使用 order 数组对位置进行排序。

$str = "{3}15{2}2{4}132{5}52{6}22";
$matches = array();
preg_match_all('/\{([0-9]+)\}([0-9]+)/', $str, $matches);

array_shift($matches);
$options = array();
for($x = 0; $x < count($matches[0]); $x++){
    $options[] = array($matches[0][$x], $matches[1][$x]);
}
$order = [3,4,2,5,6];

usort($options, function($a, $b) use ($order) {
   return array_search($a[0], $order) - array_search($b[0], $order); 
});

要将数据恢复为所需的格式,您只需

$str = "";
foreach($options as $opt){
    $str.="{".$opt[0]."}".$opt[1];
}

这里的好处之一是,当您添加新的选项类型时,插入调整顺序只需将选项编号插入 $order 数组的正确位置即可。

关于php - 如何更改较大字符串中子字符串的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16972124/

相关文章:

php - 无法在 MySQL 表中搜索查询

javascript - JSON htmlentities javascript

php - 我想在 PHP 中比较两个逗号分隔的字符串,并只保留两者中出现的值

php - 新电子邮件仅适用于 Imap 和 PHP

PHP投票系统查看选票

python - 如何从sql查询中提取列名

php - 使用存储在 MySQL DB 中的 PHP 在字符串中添加数字

java - 字符串表示形式的二进制数据到 PDF 文件

php - 有没有办法从 URL 获取 Facebook 见解数据并将其放入 php 变量中?

php - 如何使用 PHP 从多个列中选择最小值