如何使用Regex将字符串拆分为2D数组?

Mat*_*ers 6 php regex arrays string

我遇到了一个看似简单的问题,但却打败了我那些微薄的正则表达技巧.我有一个字符串,我需要转换为数组,然后相应地处理值,这很简单,但字符串的格式不能更改(它是在别处生成),它的逻辑让我感到困惑.

字符串是:

[6] [2] [3] 12.00; [5] [4]
Run Code Online (Sandbox Code Playgroud)

它基本上是一组id和十进制值(在这种情况下id 3 == 12.00).id的数量可以随时改变,十进制值可以在任何或所有id中.

在理想的世界中,我将拥有以下数组:

Array (
   [0] => Array (
             [id]  => 6
             [num] => 
          )
   [1] => Array (
             [id]  => 2
             [num] => 
          ) 
   [2] => Array (
             [id]  => 3
             [num] => 12.00 
          )
   Etc...
Run Code Online (Sandbox Code Playgroud)

你们中的任何一个正则表达式向导都知道如何通过比我能够实现的更少的咒骂来实现这一目标吗?

到目前为止,我已经能够使用以下方法提取id:

preg_match_all('@\[(.*?)\]@s', $string, $array);
Run Code Online (Sandbox Code Playgroud)

和小数使用:

preg_match_all('/([0-9]+[,\.]{1}[0-9]{2})/', $string, $array);
Run Code Online (Sandbox Code Playgroud)

但是失去了id和值之间的相关性.

Fra*_*nes 3

例子:

<?php

$string = '[6] [2] [3] 12.00; [5] [4]';

preg_match_all('/\[(?P<id>\d+)\](?: (?P<num>[\d\.]+);)?/', $string, $matches, PREG_SET_ORDER);

var_dump($matches);
Run Code Online (Sandbox Code Playgroud)

输出:

array(5) {
  [0]=>
  array(3) {
    [0]=>
    string(3) "[6]"
    ["id"]=>
    string(1) "6"
    [1]=>
    string(1) "6"
  }
  [1]=>
  array(3) {
    [0]=>
    string(3) "[2]"
    ["id"]=>
    string(1) "2"
    [1]=>
    string(1) "2"
  }
  [2]=>
  array(5) {
    [0]=>
    string(10) "[3] 12.00;"
    ["id"]=>
    string(1) "3"
    [1]=>
    string(1) "3"
    ["num"]=>
    string(5) "12.00"
    [2]=>
    string(5) "12.00"
  }
  [3]=>
  array(3) {
    [0]=>
    string(3) "[5]"
    ["id"]=>
    string(1) "5"
    [1]=>
    string(1) "5"
  }
  [4]=>
  array(3) {
    [0]=>
    string(3) "[4]"
    ["id"]=>
    string(1) "4"
    [1]=>
    string(1) "4"
  }
}
Run Code Online (Sandbox Code Playgroud)