2017-09-25 46 views
1

運行PHP 7.1.5,我有一個很長的字符串輸出,我與preg_match_all分組。我試圖讓每個輸出組成爲一個新的數組key => value。例如,我有一個很長的字符串是這樣的:PHP preg_match_all大字符串分組與增量鍵=>值

$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);

這將提取的信息,但是,這一切都包含在$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 
) 

正如你所看到的,第一和第三項是相同的,我有很多的重複條目。我可以通過運行array_unique($results)來解決這個問題。

回答

2

如果數據的子元素中有一個已知量(在這種情況下,5),你可以使用array_chunk()

<?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); 

Demo

如果你不知道有多少元素會有,但可以假設它們都具有相同的,你可以指望多少個鍵也有,然後使用該號碼:

<?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); 

最後,如果numbe元素r爲不同用戶之間的變量,那麼你可以設置一個固定的「最後一個元素」,當它發現停止用戶陣列:

// $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); 

Demo

+0

感謝你爲這個。有用。你有沒有辦法指定'Zip'作爲數組中的最後一個鍵,下一個鍵是新的數組鍵? 我可以看到這解決了第二條地址線的問題,它會拋出'array_chunk'。 – INA2N

+0

第二個示例應解決(雙關不打算)。它將通過搜索關鍵字重複的時間來計算每個數組的長度。 – ishegg

+0

你有一個很好的答案,但經過幾次測試後,不幸的是,它沒有奏效。通常情況下,還有第二條地址線會引發所有事情。 還有什麼你能想到的? – INA2N