2016-07-26 7 views
-1

주요 목표 : 전체 배열을 나중에 XML로 변환해야합니다.PHP의 다차원 배열을 구문 분석

다음 작업을 수행하고 싶습니다. 모든 키 (예 : 12772)에 대해 데이터베이스에서 데이터를 가져와야하므로 간단하게 변환 할 수 없습니다. 가져온 데이터는 태그의 속성이됩니다.

제 아이디어는 가장 깊은 차일을 하나의 XML 문자열에 결합하는 것이 었습니다. 그러나 내가 가장 깊은 수준에 있는지 어떻게 알 수 있습니까? 나는 do ... while-loop의 종류를 생각해 봤지만 엘리먼트에 자식이 있는지 없는지 정확하게 확인하는 방법을 모른다. 당신이 볼 수있는

배열의 깊이는 다를 수 있습니다

Array 
(
    [12772]=>Array 
     (
      [16563]=>Array 
       (
        [0] => <xml>Information 1</xml> 
        [1] => <xml>Information 2</xml> 
       ) 
     ) 

    [16532]=>Array 
     (
      [0] => <xml>Information 1</xml> 
      [1] => <xml>Information 2</xml> 
     ) 

) 

어떤 도움은 매우 감사합니다!

/편집 : 출력은 다음과 같아야합니다

<xml> 
<testsuite id='12772' name='fetched from database'> 
    <testsuite id='16563' name='fetched from database'> 
     <testcase id='0'>Information 1</testcase> 
     <testcase id='1'>Information 2</testcase> 
    </testsuite> 
</testsuite> 
<testsuite id='16532' name='fetched from database'> 
    <testcase id='0'>Information 1</testcase> 
    <testcase id='1'>Information 2</testcase> 
</testsuite> 

답변

1

재귀가 구조 같은 트리에 루프 최고입니다. 기본적으로 재귀 함수는 자체를 호출하는 함수입니다. 예를 들어 작성자 :

$input = Array 
(
    12772=>Array 
     (
      16563=>Array 
       (
        0 => '<xml>Information 1</xml>', 
        1 => '<xml>Information 2</xml>' 
       ) 
     ), 
    16532=>Array 
     (
      0 => '<xml>Information 1</xml>', 
      1 => '<xml>Information 2</xml>' 
     ) 

); 

$xml = ""; 

recursiveFunction($xml, $input); 

var_dump($xml); 

function recursiveFunction(&$output, $node, $id = 0, $level = 0) 
{ 

    if (is_array($node)) { 

     if ($level === 0) { 

      $output .= "<xml>" . PHP_EOL; 

     } else { 

      $output .= str_repeat("\t", $level) . "<testsuite id='" . $id . " name='fetched from database'>" . PHP_EOL; 
     } 

     foreach ($node as $id => $newNode) { 
      recursiveFunction($output, $newNode, $id, $level + 1); 
     } 

     if ($level === 0) { 

      $output .= "</xml>"; 

     } else { 

      $output .= str_repeat("\t", $level) . "</testsuite>" . PHP_EOL; 
     } 

    } else { 

     $output .= str_repeat("\t", $level) . "<testcase id='" . $id . "'>" . $node . "</testcase>" . PHP_EOL; 
    } 
} 

당신은 여기를 테스트 할 수 있습니다 : 귀하의 의견 http://sandbox.onlinephpfunctions.com/code/dcabd9ffccc1a05621d8a21ef4b14f29b4a765ca

+0

감사합니다. 하지만 어느 수준/경로에 있는지 어떻게 알 수 있습니까? 배열을 함께 사용하지 않는 $ 노드를 "병합"하고 싶지만 병합 된 값은 같은 수준에 있어야합니다. 이전 값을 삭제하고 새 값을 설정하는 것과 같습니다. 필자의 예제 XML은 최상의 정보가 아니며, "정보 1"은 별도의 태그 여야합니다.이 태그를 하나의 배열 값에 넣고 싶습니다. – bademeister

+0

레벨과 경로를 가질 수 있도록 코드를 업데이트했습니다. 자, 나는 물건을 출력하기를 원한다는 것을 잘 모르겠다. 배열이나 xml인가? http://sandbox.onlinephpfunctions.com/code/a047ef69786391d8ece1cfbad9a24a8c72f2a428 –

+0

출력이 XML이어야하며 주 질문에 형식이 추가되었습니다. – bademeister