preg_match_allの概要はすでに知っているはずです。
3 番目のパラメーターは、テキスト内で見つかったすべての一致を含む配列です (2 番目のパラメーター)。
これは、一連の異なる配列を含む配列です。最初の配列には、一致したパターンがすべて含まれています。その他はサブパターンの一致です。私は正規表現に関するエッセイを書くためにここにいるわけではないので、あなたがそれらを知っていると仮定します (更新: サブパターンは括弧で囲まれたものであり、あなたの場合はまったく役に立ちません)。
$pizza='1-4,2,3-1,5-4,7';
preg_match_all("/\d\-\d/", $pizza, $return);
var_dump($return);
同様の、混乱の少ない結果が得られます (正規表現には括弧がありません)。
array
0 =>
array
0 => string '1-4' (length=3)
1 => string '3-1' (length=3)
2 => string '5-4' (length=3)
print_r 形式の方が簡単な場合:
Array ([0]=>Array([0]=>1-4 [1]=>3-1 [2]=>5-4))
配列を一度に 1 要素ずつ消費するには、foreach制御構造を使用できます。
演習を行うコードは次のようになります。
foreach ($return[0] as $slice) {
<do whatever you need with $slice >
}
中括弧内のコードは、配列 $return[0] (一致したスライスを含む配列) の要素と同じ回数実行され、$slice は、異なる実行で異なる要素の値を想定します。
これで疑問が解決することを願っています。
あなたの仕事を解決するために別のアプローチを使用しただろうと言いました:
$pizza='1-4,2,3-1,5-4,7';
$return = array_filter(
explode(',',$pizza), // turn the string into an array
function($x){return strpos($x,'-');} // filter out the slices without a -
);
foreach ($return as $slice) { // NOTE: no $return[0]
<do whatever you need with $slice >
}
ただし、操作するデータ量が非常に少ないため、パフォーマンスの違いは無視できるため、これは個人的な好みの問題です。