2017-09-25 13 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);

これはこれは、すべての1つのキーの下$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'を捨てる2番目のアドレス行を持つという問題を解決することができます。 – INA2N

+0

2番目の例は、それを扱うべきではありません。キーの繰り返しを検索することで、各配列の長さを計算します。 – ishegg

+0

あなたは良い答えがありますが、いくつかのテストを実行した後、残念ながら、うまくいきませんでした。多くの場合、2番目のアドレス行があり、それはすべてをスローします。 他に何か考えてもいいですか? – INA2N

関連する問題