2013-06-07 5 views
3

문자열에 괄호 안에 항목이 있으면 다차원 배열을 만들려고 할 때 문자열을 배열로 변환하려고합니다.PHP : 문자열을 다차원 배열로 변환

예를 들어, 전달로 문자열 : (메리 포핀스) 우산 (색상 황색)

I는 다음과 같습니다 배열을 만들 것입니다 :

Array ([0] => Array ([0] => mary [1] => poppins) [1] => umbrella [2] => Array ([0] => color [1] => yellow)) 

내가 얻을 수있었습니다 데이터는 다음을 통해 배열로 배치됩니다.

preg_match_all('/\(([A-Za-z0-9 ]+?)\)/', stripslashes($_GET['q']), $subqueries); 

그러나 다차원 배열에 배치 된 항목을 가져 오는 데 문제가 있습니다.

아이디어가 있으십니까? 일부 PHP - 푸와

+3

에서 테스트. – deceze

+0

재귀 사용 (재귀 regexp 및 재귀 funcall) –

+0

중첩 대괄호가 있을까요? '여보세요 (시원한 (술집) (트롤 (시도 baz)))'? – HamZa

답변

6

:

$string = '(Mary Poppens) Umbrella (Color Yellow)'; 
$array = array(); 
preg_replace_callback('#\((.*?)\)|[^()]+#', function($m)use(&$array){ 
    if(isset($m[1])){ 
     $array[] = explode(' ', $m[1]); 
    }else{ 
     $array[] = trim($m[0]); 
    } 
}, $string); 
print_r($array); 

출력 :

Array 
(
    [0] => Array 
     (
      [0] => Mary 
      [1] => Poppens 
     ) 

    [1] => Umbrella 
    [2] => Array 
     (
      [0] => Color 
      [1] => Yellow 
     ) 

) 

Online demo

주 내가 사용하고 있기 때문에 당신이 5.3+ PHP 필요 익명의 기능.


호환있어?

Online demo

$string = '(Mary Poppens) Umbrella (Color Yellow)'; 

preg_match_all('#\((.*?)\)|[^()]+#', $string, $match, PREG_SET_ORDER); 

foreach($match as $m){ 
    if(isset($m[1])){ 
     $array[] = explode(' ', $m[1]); 
    }else{ 
     $array[] = trim($m[0]); 
    } 
} 

print_r($array); 
그녀가 BTW * "메리 포핀스"*라고 PHP 4.3

+1

답장을 보내 주셔서 감사합니다. 나는 앞장서 ​​야했다. 나는 PHP 5.2.x를 사용 중이다. – zeropsi

+1

아직 익명의 함수를 정규 함수로 대체하고 콜백으로 이름을 전달한다. –

+0

@ user1278584 * PHP4.3 + * – HamZa

관련 문제