这相当令人困惑,但我会尽力解释......
我有一个 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 = 蓝色。我已经有了知道如何解析这些字符串并正确传递信息的 PHP 代码,但有一个例外:由于可能过于复杂而无法进入这里的原因,选项的顺序需要为 3,4,2,5,6。(尝试修改系统的其余部分以接受当前订单将是一项艰巨的任务。)如果特定组合没有全部五个选项,那很好,例如“{3}7{2}44”交付预期的结果。问题仅在于包含选项 2 和选项 4 的组合——它们的顺序需要切换,以便任何同时包含选项 2 和 4、{4} 及其对应值的组合出现在 {2} 之前并且它是对应的价值。
我尝试将该列引入 Excel 并使用 Text to Columns,将它们按“{”和“}”字符拆分并重新排序列,但由于并非每个字符串都产生相同数量的列,因此顺序得到以其他方式搞砸了(比如选项 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,这似乎不允许使用自定义排序进行排序。如果我可以投票支持每个人的解决方案(我在 PHP Sandbox 中尝试过的所有解决方案都有效),我会的,但我的代表太低了。