2012-05-12 8 views
0

私はここで同様の質問を見つけましたが、私のシナリオでは正確ではありませんでした。 私は比較的新しいPHPですが、* preg_match_all *のマニュアルを読んでいます。PHP preg_match_allがネストされています

私は日付を見つけるためにページを解析しています。常に同じ形式です(例:13年12月13日)。 これは*文私*のpreg_match_allです:

$eventDateRegex = '/[0-9]{2}\s[A-Z]{1}[a-z]{2}\s[0-9]{4}/'; 
preg_match_all($eventDateRegex, $parsedEvent, $eventDates[$i]); 

$ Iそれはためのループでだからちょうどイテレータです。 $ eventDatesで正しい結果を受け取っていますが、1つのレベルがネストされているようです。

私の結果はこのようなものです:私がすることを好むのに対し

array 
    0 => 
    array 
     0 => 
     array 
      0 => string '19 Apr 2012' (length=11) 
      1 => string '24 May 2012' (length=11) 
    1 => 
    array 
     0 => 
     array 
      0 => string '21 Apr 2012' (length=11) 
      1 => string '30 Jun 2012' (length=11) 

array 
    0 => 
    array 
     0 => string '19 Apr 2012' (length=11) 
     1 => string '24 May 2012' (length=11) 
    1 => 
    array 
     0 => string '21 Apr 2012' (length=11) 
     1 => string '30 Jun 2012' (length=11) 

が可能これですか、それだけで方法のためである* preg_match_all *を吐き出します多次元アレイ?

答えて

1

あなたが望む形式で結果を得ています。 EventDates配列のインデックスの最初のレベルは、forループとインデックス$ iの使用によって生成されます。もし$ eventDatesを通過するので、例えば、配列

array 
    0 => 
    array 
     0 => 
     array 
      0 => string '19 Apr 2012' (length=11) 
      1 => string '24 May 2012' (length=11) 

の最初の要素は、正しい配列構造

array 
      0 => 
      array 
       0 => string '19 Apr 2012' (length=11) 
       1 => string '24 May 2012' (length=11) 

しかしeventDates内の位置0にある[0]プリプレグ関数に一致する配列として。

+0

こんにちは@ msgmash.comを取得します、あなたはそれループイテレータについて正しいです。しかし、問題は依然として続く。ループ外でvar_dumpを実行すると、配列構造の出力が得られました。 preg_match_allはネストされた結果をあまりにも深く返しているようです。同じ結果セットの中で、私はこれがあります。 :単一の日付を取得するために 7 => 配列 0 => 配列 0 => '31 2012' 年8月 を、私は現在、これを行うために必要なのです$ eventDates [0] [0] [0] 私はあなたの答えを誤解しているかもしれないという事実に気付いていますか? – Jay

+0

preg_match_allが結果を保持する配列をフォーマットする方法のため、結果が得られません。この配列は多次元配列で、最初の要素は正規表現全体と一致するすべての文字列を保持する配列です。したがって、最初のレベルインデックスはループインデックスであり、2番目のレベルはpreg_match_allのすべての文字列一致を保持する配列の最初のレベルインデックスであり、3番目のレベルインデックスは一致する各文字列です。プログラムで配列を変更しない限り、代替手段はありません。 –

+0

ええ、もう少し考えてみて、それに同意しました。私は3Dアレイを受け入れなければなりません。ありがとう! – Jay

0

必要に応じて配列を再構成することができます。

$arr = array(
      array(
       array('19 Apr 2012', '24 May 2012') 
       ), 
      array(
       array('21 Apr 2012', '30 Jun 2012') 
       ) 
      ); 

for ($i = 0; $i < count($arr); $i++) 
    $arr[$i] = $arr[$i][0]; 

var_dump($arr); 

あなたは

array 
    0 => 
    array 
     0 => string '19 Apr 2012' (length=11) 
     1 => string '24 May 2012' (length=11) 
    1 => 
    array 
     0 => string '21 Apr 2012' (length=11) 
     1 => string '30 Jun 2012' (length=11) 
+0

ありがとうございます。私はこれをやろうと考えていましたが、私は効率についてもっと心配しています。 – Jay

+0

何十万回も実行していない限り、パフォーマンスは無視してください。 – Jack

+0

それは本当です。私はreg_match_allをほんの数回使用しているので問題にはならないはずです。 – Jay

関連する問題