2017-12-22 19 views
0

私は爆発して情報を得るために必要な文字列を持っています。文字列の部分を配列に抽出する

サンプル文字列:

"20' Container 1, 40' Open Container 1, 40-45' Closed Container 3" 

まず私は,で文字列を爆発し、取得しています

"20' Container 1" 
"40' Open Container 1" 
"40-45' Closed Container 3" 

今、私は結果を得るようにだけでなく、すでに爆発配列を爆発したいです以下の形式で

array[ 
    0 => [ 
     0 => "20'" 
     1 => "Container" 
     2 => "1" 
     ] 
    1 => [ 
     0 => "40'" 
     1 => "Open Container" 
     2 => "1" 
     ] 
    ] 

文字列は異なる場合がありますが、フォーマットが同じであると判断されます。 length type number

答えて

1

カンマ区切りで爆発した文字列スルーループ、配列

$string = "20' Container 1, 40' Open Container 1, 40-45' Closed Container 3"; 

$result = []; 
$pattern = '/([\d-]*\')\s(.*)\s(\d+)/'; 
foreach (explode(', ', $string) as $value) { 
    preg_match($pattern, $value, $matches); // Match length, type, number 
    $result[] = array_slice($matches, 1); // Slice with offset 1 
} 

print_r($result); 
+0

これは2回目の反復で4つのインデックスのインデックスを返します。私は結果セットとして各配列の3つのインデックスを欲しい – baig772

+0

ごめんなさい。更新された回答を確認してください – Erwin

+0

この場合、正確なパターンは何でしょうか? – baig772

1

あなたは、単に必要な配列を取得するためにもう一回爆発することができ、ここで

$str = "20' Container 1, 40' Open Container 1, 40-45' Closed Container 3"; 
$result = array(); 
$temp= explode(", ",$str); 
array_walk($temp, function($item, $key) use(&$result) { 
    $result[$key] = explode(" ", $item); 
}); 
print_r($result); 

demoに取り組んでいます。

+0

各配列に3つのインデックスが必要です。 2回目の反復で4つのインデックスが得られます – baig772

0

行くための別の方法をもたらすためにlength type number上の各試合のベースを押す:

$str = "20' Container 1, 40' Open Container 1, 40-45' Closed Container 3"; 
preg_match_all("/(\d+(?:-\d+)?')\s+([a-z\s]+)\s(\d+)(?:,)?/i", $str, $match); 
for($i = 0; $i <3; $i++) { 
    $final[] = array_slice(array_column($match, $i), 1); 
} 
print_r($final); 

出力:

Array 
(
    [0] => Array 
     (
      [0] => 20' 
      [1] => Container 
      [2] => 1 
     ) 

    [1] => Array 
     (
      [0] => 40' 
      [1] => Open Container 
      [2] => 1 
     ) 

    [2] => Array 
     (
      [0] => 40-45' 
      [1] => Closed Container 
      [2] => 3 
     ) 

) 

Reg例:

/    : regex delimiter 
    (   : start group 1 
    \d+   : 1 or more digits 
    (?:-\d+)? : non capture group, a dash followed by digits, optional 
    '   : 'single quote 
)    : end group 1 
    \s+   : 1 or more spaces 
    (   : start group 2 
    [a-z\s]+ : 1 or more alphabetic or space 
)    : end group 2 
    \s+   : 1 or more spaces 
    (   : start group 3 
    \d+   : 1 or more digits 
)    : end group 3 
    (?:,)?  : non capture group, a comma followed by space, optional 
/i    : regex delimiter, case insensitive 
関連する問題