尝试使用 SQL 中的 PHP 将 SKU 编号从 55A_3 修复为 A55_3

Trying to fix SKU numbers from 55A_3 to A55_3 with PHP in SQL

我已将 SKU 编号从 CSV 文件导入到 SQL 数据库中。 模式看起来像:

55A_3  
345W_1+04B_1  
128T_2+167T_2+113T_8+115T_8  

我正在尝试移动数字前面的所有字母。 喜欢:

A55_3  
W345_1+B04_1  
T128_2+T167_2+T113_8+T115_8  

我最好的想法是搜索 345W 等,然后将其替换为 W345 等:

$sku = "345W_1+04B_1";

$B_range_num = range(0,400);
$B_range_let = range("A","Z");

然后生成查找和替换数组

$B_find = 
$B_replace =

也许只是使用 str_replace??

$res = str_replace($B_find,$B_replace,$sku);

结果应适用于所有 SKU 编号
W345_1+B04_1
有什么想法吗?

这里我定义了一个方法,格式不限长度。

$str = '128T_2+167T_2+113T_8+115T_8';

echo convertProductSku($str);

function convertProductSku($str) {
  $arr = [];
  $parts = explode('+', $str);

  foreach ($parts as $part) {
    list($first, $second) = array_pad(explode('_', $part), 2, null);
    $letter = substr($first, -1);
    $number = substr($first, 0, -1);

    $arr[] = $letter . $number . ($second ? '_' . $second : '');
  }

  return implode('+', $arr);
}

您可以使用 preg_replace 来完成这项工作,查找一些数字,后跟一个字母和一个 _ 带数字,一个 + 或字符串结尾,然后交换数字和字母的顺序:

$skus = array('55A_3', 
              '345W_1+04B_1',
              '128T_2+167T_2+113T_8+115T_8',
              '55A');
foreach ($skus as &$sku) {
    $sku = preg_replace('/(\d+)([A-Z]+)(?=_\d+|\+|$)/', '', $sku);
}
print_r($skus);

输出:

Array
(
    [0] => A55_3
    [1] => W345_1+B04_1
    [2] => T128_2+T167_2+T113_8+T115_8
    [3] => A55
)

Demo on 3v4l.org