PHP preg_match_将所有大字符串按递增键分组=>;价值观
运行PHP7.1.5时,我有一个长字符串输出,我用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
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);