将字母和数字(无分隔符)交替的字符串解析为关联数组


Parse string of alternating letters and numbers (no delimiters) to associative array

我需要解析一个由字母和数字交替组成的字符串,并填充一个数组,其中字母是键,数字是值。

的例子:

p10s2z1234

输出
Array(
    'p' => 10,
    's' => 2,
    'z' => 1234
)

使用正则表达式获取所需的值,然后将数组组合为关联数组。例如:

$str = 'p10s2z1234';
preg_match_all('/([a-z]+)('d+)/', $str, $matches); //handles only lower case chars. feel free to extend regex
print_r(array_combine($matches[1], $matches[2]));

场景1:您希望解析一个字符串,该字符串有单个字母作为键,将生成三对值,并且您希望将数字转换为整数。那么,最好、最直接的方法是sscanf(),它带有数组解构——一个函数调用就可以完成所有工作。(演示)

$str = 'p10s2z1234';
[
    $k1,
    $result[$k1],
    $k2,
    $result[$k2],
    $k3,
    $result[$k3]
] = sscanf($str, '%1s%d%1s%d%1s%d');
var_export($result);
输出:

array (
  'p' => 10,
  's' => 2,
  'z' => 1234,
)

场景2:您希望与场景1相同的解析和输出,但是作为键的子字符串具有可变/未知长度。(演示)

$str = 'pie10sky2zebra1234';
[
    $k1,
    $result[$k1],
    $k2,
    $result[$k2],
    $k3,
    $result[$k3]
] = sscanf($str, '%[^0-9]%d%[^0-9]%d%[^0-9]%d');
var_export($result);

场景3:你想用正则表达式解析字符串,不关心值是"string"数据类型。(演示)

$str = 'pie10sky2zebra1234';
[
    $k1,
    $result[$k1],
    $k2,
    $result[$k2],
    $k3,
    $result[$k3]
] = preg_split('/('d+)/', $str, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
var_export($result);

场景4:如果您不知道输入字符串将生成多少对,则使用array_combine()。(演示)

$str = 'pie10sky2zebra1234extra999';
var_export(
    preg_match_all('/('D+)('d+)/', $str, $m)
    ? array_combine($m[1], $m[2])
    : []
);