PHP preg_match_将所有大字符串按递增键分组=>;价值观

PHP preg_match_将所有大字符串按递增键分组=>;价值观,php,arrays,preg-match-all,Php,Arrays,Preg Match All,运行PHP7.1.5时,我有一个长字符串输出,我用preg\u match\u all进行分组。我试图将每个输出组放入一个新数组key=>value。例如,我有一个长字符串,如下所示: $string = ( Name: John Doe Address: 123 Main St City: Chicago State: IL Zip: 60021 Name: Jane Smith Address: 123 State Ave City: Boston State: MA Zip: 02501

运行PHP7.1.5时,我有一个长字符串输出,我用
preg\u match\u all
进行分组。我试图将每个输出组放入一个新数组
key=>value
。例如,我有一个长字符串,如下所示:

$string = (
Name: John Doe
Address: 123 Main St
City: Chicago
State: IL
Zip: 60021
Name: Jane Smith
Address: 123 State Ave
City: Boston
State: MA
Zip: 02501
Name: John Doe
Address: 123 Main St
City: Chicago
State: IL
Zip: 60021
)
preg|u match|u all('!(名称。*|地址。*|城市。*|州。*|邮编。*)!',$string,$results)

这将提取信息,但是,所有信息都包含在一个键下的
$results
数组中。而不是此输出:

Array (
0 =>
    [0] => Name: John Doe
    [1] => Address: 123 Main St
    [2] => City: Chicago
    [3] => State: IL
    [4] => Zip: 60021
    [5] => Name: Jane Smith
    [6] => Address: 123 State Ave
    [7] => City: Boston
    [8] => State: MA
    [9] => Zip: 02501
    [10] => Name: John Doe
    [11] => Address: 123 Main St
    [12] => City: Chicago
    [13] => State: IL
    [14] => Zip: 60021
)
我需要在阵列中为每个捕获组提供以下输出:

Array (
    [0] =>
        [0]Name: John Doe
        [1]Address: 123 Main St
        [2]City: Chicago
        [3]State: IL
        [4]Zip: 60021

    [1] =>
        [0]Name: Jane Smith
        [1]Address: 123 State Ave
        [2]City: Boston
        [3]State: MA
        [4]Zip: 02501

     [2] =>
        [0]Name: John Doe
        [1]Address: 123 Main St
        [2]City: Chicago
        [3]State: IL
        [4]Zip: 60021
)

如您所见,第一个和第三个条目是相同的,我有很多重复条目。我可以通过运行
数组\u unique($results)

来解决这个问题,如果数据中有已知数量的子元素(在本例中为5),则可以使用:


谢谢您的帮助。它起作用了。您是否有办法将
Zip
指定为数组中的最后一个键,而下一个键将是新的数组键?我可以看到这解决了第二个地址行的问题,它会抛出
array\u chunk
。当一个键重复时,它将通过搜索来计算每个数组的长度。你有一个很好的答案,但在运行了一些测试之后,不幸的是,它没有工作。通常情况下,还有第二条地址线,这会让一切都变得混乱。你还能想到什么?@INA2N我添加了一个解决方案,考虑到每个用户的元素数量可变。
<?php
$string = "
Name: John Doe
Address: 123 Main St
City: Chicago
State: IL
Zip: 60021
Name: Jane Smith
Address: 123 State Ave
City: Boston
State: MA
Zip: 02501
Name: John Doe
Address: 123 Main St
City: Chicago
State: IL
Zip: 60021";
preg_match_all('!(Name.*|Address.*|City.*|State.*|Zip.*)!', $string, $results);
$records = array_chunk($results[0], 5);
var_dump($records);
<?php
$string = "
Name: John Doe
Address: 123 Main St
City: Chicago
State: IL
Zip: 60021
Name: Jane Smith
Address: 123 State Ave
City: Boston
State: MA
Zip: 02501
Name: John Doe
Address: 123 Main St
City: Chicago
State: IL
Zip: 60021";
preg_match_all('!(Name.*|Address.*|City.*|State.*|Zip.*)!', $string, $results);
$records = $results[0];
$keys = [];
foreach ($records as $record) {
    $recordArray = explode(":", $record); // $recordArray[0] will have the key
    if (in_array($recordArray[0], $keys)) break; // if key exists, we started a new record
    $keys[] = $recordArray[0];
}
$records = array_chunk($records, count($keys));
var_dump($records);
// $string
preg_match_all('!(Name.*|Address.*|City.*|State.*|Zip.*)!', $string, $results);
$records = $results[0];
$finalResults = [];
$lastElement = "Zip";
foreach ($records as $record) {
    $result[] = $record;
    $recordArray = explode(":", $record);
    if ($recordArray[0] === $lastElement) {
        $finalResults[] = $result;
        $result = [];
    }
}
var_dump($finalResults);