Php 按数字格式拆分数字

Php 按数字格式拆分数字,php,Php,我真的想得太久了,找不到做这件事的逻辑/算法。然后我只使用if-else,但我知道这是不好的,因为会有太多的语句 我有下面的数字格式组来拆分输入的数字: 01(在此数字格式后获取14位数字) 3101(此数字格式后获取6位数字) 3102(获取6位数字) 3202(获取6位数字) 13(获取6位数字) 15(获取6位数字) 11(获取6位数字) 21(得到剩下的) 一些规则: 01始终在第一个序列中 21始终在最后一个序列中 除01和21之外的其他数字格式可以在任何序列位置 不能重复相同的

我真的想得太久了,找不到做这件事的逻辑/算法。然后我只使用if-else,但我知道这是不好的,因为会有太多的语句

我有下面的数字格式组来拆分输入的数字:

  • 01(在此数字格式后获取14位数字)
  • 3101(此数字格式后获取6位数字)
  • 3102(获取6位数字)
  • 3202(获取6位数字)
  • 13(获取6位数字)
  • 15(获取6位数字)
  • 11(获取6位数字)
  • 21(得到剩下的)
一些规则

  • 01始终在第一个序列中
  • 21始终在最后一个序列中
  • 除01和21之外的其他数字格式可以在任何序列位置
  • 不能重复相同的前缀编号格式
示例,输入编号:010069008517306731020020001319100421191004091395

结果应为:

01:00690085173067
3102:002000
13:191004
21:191004091395

目前我只使用IF-ELSE语句来获取后面的数字

这是我使用PHP的代码片段。此代码只能处理上面的示例输入。根据规则,可能会有其他序列号格式,但如果只使用这样的if-else语句将很困难

$first = substr($input, 0, 2);
if ($first == 01) { 

    $itemCode =  substr($input, 2, 14); // get the 6 digits after 01
    $second = substr($input, 16, 4);

    if ($second == 3102) { 
        $quantity =  substr($input, 20, 6);  // get the 6 digits after 3102
        $third = substr($input, 26, 2);
        if ($third == 13) { 
           $packedDate =  substr($input, 28, 6); // get the 6 digits after 13
            $fourth = substr($input, 34, 2);  
            if ($fourth == 21) {
                $serialNumber =  substr($scanner, 36); // get the rest number after 21
            } 
       }
   }
}

有什么好办法解决这个问题吗

如果前缀不重复,您可以使用
preg\u match\u all
将前缀与其每个尾随数字进行匹配,使用
array\u combine
创建按前缀索引的数字数组:

$input = '010069008517306731020020001319100421191004091395';

if (preg_match_all('/(01)(\d{14})|(310[12]|3202|1[135])(\d{6})|(21)(\d+)/', $input, $matches)) {
    $numbers = array_filter(array_combine($matches[1], $matches[2]) + 
                            array_combine($matches[3], $matches[4]) + 
                            array_combine($matches[5], $matches[6]));
    print_r($numbers);
}
else {
    echo "Invalid input!";
}
输出:

Array
(
    [01] => 00690085173067
    [3102] => 002000
    [13] => 191004
    [21] => 191004091395
)

如果前缀不重复,您可以使用
preg\u match\u all
将前缀与其每个尾随数字进行匹配,使用
array\u combine
创建按前缀索引的数字数组:

$input = '010069008517306731020020001319100421191004091395';

if (preg_match_all('/(01)(\d{14})|(310[12]|3202|1[135])(\d{6})|(21)(\d+)/', $input, $matches)) {
    $numbers = array_filter(array_combine($matches[1], $matches[2]) + 
                            array_combine($matches[3], $matches[4]) + 
                            array_combine($matches[5], $matches[6]));
    print_r($numbers);
}
else {
    echo "Invalid input!";
}
输出:

Array
(
    [01] => 00690085173067
    [3102] => 002000
    [13] => 191004
    [21] => 191004091395
)

始终按最后一个顺序排列的
21是什么意思?它总是在最后给出任何输入字符串?@vivek_23就像我的示例输入:010069008517306731020020001319100421191004091395 21总是在最后一位所以,作为输入给出的字符串总是有效的?如果我们有类似于
0132013213151121
?Hi@vivek_23。最主要的是我想得到这个数字格式之后的下一个数字(01310131023202,13,15,11,21)。是的,如果输入:0132032021315121082918292是的,我知道您需要后面的数字,但我们这里有重叠的问题。如果出现这样的问题,是否要抛出异常?而且,
3101
01
重叠了
01
。什么叫
21总是排在最后一位?它总是在最后给出任何输入字符串?@vivek_23就像我的示例输入:010069008517306731020020001319100421191004091395 21总是在最后一位所以,作为输入给出的字符串总是有效的?如果我们有类似于
0132013213151121
?Hi@vivek_23。最主要的是我想得到这个数字格式之后的下一个数字(01310131023202,13,15,11,21)。是的,如果输入:0132032021315121082918292是的,我知道您需要后面的数字,但我们这里有重叠的问题。如果出现这样的问题,是否要抛出异常?而且,
3101
01
有重叠。它工作正常!快回答我的问题。令人惊叹的。非常感谢你尼克:)@susilon别担心-我很高兴能帮上忙。很有效!快回答我的问题。令人惊叹的。非常感谢尼克:)@susilon别担心,我很高兴能帮上忙。