preg_match_allはPREG_SET_ORDERで

フラグを省略する(デフォルトはPREG_PATTERN_ORDER)と$rは以下のようになるので使いずらい。

preg_match_all('/(.)(.)/','abcd',$r)
$r→[ ["ab","cd"], ["a","c"], ["b","d"] ]

$rを以下のようにするにはPREG_SET_ORDERを指定する

preg_match_all('/(.)(.)/','abcd',$r,PREG_SET_ORDER)
$r→[ ["ab","a","b"], ["cd","c","d"] ]