2012-05-12 4 views
0

여기에도 비슷한 질문이 있지만 제 시나리오에는 정확하지 않았습니다. 저는 PHP에 비교적 익숙하지 만 * preg_match_all * 매뉴얼을 읽었습니다.PHP preg_match_all이 너무 깊게 중첩되었습니다.

나는 날짜를 찾기 위해 페이지를 구문 분석하고있다. 항상 같은 형식입니다 (예 : 13 월 12 일,). 이 for 루프 에 있기 때문에

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

$ 내가 그냥 반복자입니다 : 이 내 *으로, preg_match_all의 *의 문입니다. 내가 $ eventDates에서 올바른 결과를 수신하고 있습니다, 그러나, 너무 깊게 한 단계 중첩 될 것으로 보인다.

내 결과는 다음과 같다 :

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의 사용에 의해 생성됩니다. 예를 들어, 어레이

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은 $ 전달하므로 정확한 어레이 구조를이다 eventDates [0] 레그 함수에 일치하는 배열로서 .

+0

는 @ msgmash.com 안녕, 당신이 바로 루프 반복자에 대해있어 얻을 것이다. 그러나 문제는 여전히 지속됩니다. 루프 외부에서 var_dump를 수행하여 배열 구조의 출력을 얻었습니다. preg_match_all이 너무 깊게 중첩 된 결과를 반환하는 것으로 보입니다. 같은 결과 세트 내에서,이 있습니다 7 => 배열 0 => 배열 0 = 2012> '31 8월 ' 하나의 날짜를 검색하려면, 나는 현재이 작업을 수행해야합니까 : $ eventDates [0] [0] [0] 나는 당신의 대답을 오인했을지도 모른다는 사실에 대해 열려 있습니까? – Jay

+0

preg_match_all이 결과를 보유하는 배열을 형식화하는 방식 때문에 원하는 결과를 얻지 못합니다. 이 배열은 첫 번째 요소가 전체 정규 표현식과 일치하는 모든 문자열을 보유하는 배열 인 다차원 배열입니다. 따라서 첫 번째 레벨 색인은 루프 색인이고, 두 번째 레벨은 preg_match_all의 모든 문자열 일치 항목을 보유하는 배열의 첫 번째 수준 색인이고 세 번째 수준 색인은 일치하는 각 문자열입니다. 프로그래밍 방식으로 배열을 변경하지 않는 한 대체 방법이 없습니다. –

+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

관련 문제