2009-06-20 3 views
1

PHP에서 배열을 사용하여 xml 데이터를 수정하고 다시 작성합니다. 이것은 XML 구조 (시범 목적으로 단순화)이다변수를 사용하여 다차원 배열 내의 특정 요소에 액세스하는 방법은 무엇입니까?

<docs> 
    <folder> 
    <name>Folder name</name> 
    <date>20.06.2009</date> 
    <folder> 
     <name>Subfolder1</name> 
     <date></date> 
    </folder> 
    <folder> 
     <name>Subfolder1</name> 
     <date></date> 
    </folder> 
    <file> 
     <name></name> 
    </file> 
    </folder> 
    <name></name> 
    <date></date> 
</docs> 

this code 사용이 다음 다차원 배열로 파싱 및 변환된다

Array 
(
    [docs] => Array 
     (
      [_c] => Array 
       (
        [folder] => Array 
         (
          [_c] => Array 
           (
            [name] => Array 
             (
              [_v] => Folder name 
             ) 

            [date] => Array 
             (
              [_v] => 20.06.2009 
             ) 

            [folder] => Array 
             (
              [0] => Array 
               (
                [_c] => Array 
                 (
                  [name] => Array 
                   (
                    [_v] => Subfolder1 
                   ) 

                  [date] => Array 
                   (
                    [_v] => 
                   ) 

                 ) 

               ) 

              [1] => Array 
               (
                [_c] => Array 
                 (
                  [name] => Array 
                   (
                    [_v] => Subfolder1 
                   ) 

                  [date] => Array 
                   (
                    [_v] => 
                   ) 

                 ) 

               ) 

             ) 

            [file] => Array 
             (
              [_c] => Array 
               (
                [name] => Array 
                 (
                  [_v] => 
                 ) 

               ) 

             ) 

           ) 

         ) 

        [name] => Array 
         (
          [_v] => 
         ) 

        [date] => Array 
         (
          [_v] => 
         ) 

       ) 

     ) 

) 

길고 알아. 하지만 지금은 실제 문제에. 내가 통해 그것을 수행 할 때 이제

array_push($array['docs']['_c']['folder']['_c']['folder'][1], $newfile); 

:이 경우 Subfolder2라는 하위 폴더에 다른 파일을 추가하려면 유 구조를 볼 때, 그것은 손으로 할 수있는 문제는 아니다 (docs/폴더 이름/Subfolder2과 같은) 폴더 경로 만 알고있는 알고리즘은 배열 구조를 분석해야합니다 (각 [폴더]의 이름을 확인하고 하나 이상의 폴더가 있는지 확인하십시오. '] 또는 [number]) - 모두 좋지만 해당 새 파일에 대한 경로가 ""인 변수를 만드는 방법을 찾을 수 없습니다.

나는이 라인을 따라 어딘가에 생각했다 : 물론

$writepath = "['docs']['_c']['folder']...[1]"; // path string 
array_push($array{$writepath}, $newfile); 

이 유효한 구문이 아닙니다.

그럼 어떻게 배열 요소를 통해 경로가 포함 된 변수를 만들 수 있습니까? w3c와 php.net에 대한 연구를 다차원 배열에 도움이되지 않는 정보를 찾았습니다.

구조, xml 변환/조작 등에 관한 다른 제안 사항이 있으시면 누구나 알고 있습니다. 충분한 데이터 처리 방법으로 모든 입력

감사

에릭


편집 : 기준에 대해서는, 그 기준을 참조 할 수있다? 그게 배열의 집합을 통해 '포인터'를 이동하는 방법이 될 것이라고? 같은 것 :

$pointer = &$array['docs']; 
if (key($pointer) == '_c') { $pointer = &$pointer['_c']; } 
else (
    // create an array with '_c' key instead of empty '_v' array 
) 

이 구문은 작동하지 않습니다.

편집 : 구문이 작동합니다. 신경 쓰지 마세요. 모든 도움 주셔서 감사합니다!

답변

4

는 질문에 대한 답변하지 정확히입니다 : 대신 XML <의 -> 배열 코드 당신 사용 SimpleXML과의 XPath 기능을 제공합니다.

<?php 
$xml = '<docs> 
    <folder> 
    <name>Folder name</name> 
    <date>20.06.2009</date> 
    <folder> 
     <name>Subfolder1</name> 
     <date></date> 
    </folder> 
    <folder> 
     <name>Subfolder2</name> 
     <date></date> 
     <folder> 
     <name>Subfolder3</name> 
     <date></date> 
     </folder> 
    </folder> 
    </folder> 
</docs>';

$doc = new SimpleXMLElement($xml); $pathToParentelement = '//folder[name="Subfolder3"]'; $element = $doc->xpath($pathToParentelement); isset($element[0]) or die('not found');
$newFolder = $element[0]->addChild("folder"); $newFolder->name = "Subfolder4.1"; $newFolder->date = date(DATE_RFC822);
// let's see the result echo $doc->asxml();

$ pathToParentelement는 $ writepath보다 많거나 적습니다.

+0

xpath를 사용하는 것은이 문제에 대한 아주 좋은 해결책입니다. xml -> array 솔루션을 사용하는 것보다 익숙해지기까지 조금 더 오래 걸립니다. 그러나 장기적으로는 효과가있을 것이라고 생각합니다. –

+0

위대한 답변! SimpleXML 확장을 탐색하기 시작할 수 있다고 생각합니다. 관리가 훨씬 간단하기 때문입니다. 그러나 require PHP 5입니다. 고마워요! –

2

참조를 사용하면 도움이 될 수 있습니다.

먼저 경로 문자열에 대한 배열의 주어진 부분에 대한 참조를 반환하는 함수를 작성할 수 있습니다. 방금

array_push(get_path_array("docs/Folder name/Subfolder2"), $newfile); 

을 할 수있는 예를 들어, get_path_array("Documents") 당신이 찾고 있던 무엇인가요 $array['docs']['_c']['folder']['_c']['folder'][1], $newfile)

<?php 
function &get_path_array($path_str) 
{ 
    // your code to seek to seek the path in the array 
    return $result; 
} 
>?php 

지금 요소를 추가하기 위해 반환?

편집 (추가 정보를 php references 참조) : 회신에서 에릭의 코멘트 난 당신이 어떻게 배열 작업에 대한 혼동 될 수있다 생각

(코멘트에 맞게 너무 열심히 비트)로. PHP에는 다중 차원 배열과 같은 것이 없으며 다른 배열을 저장하는 배열 만 있습니다. 예 :

<?php 
$a = array(array(1,2,3), array(4,5,6)); 
$b = $a[1]; 
echo $b[0]; 
?> 

"4"가 출력됩니다. 위의 코드에서, $b$b을 변경, $a[1]의 복사본입니다

참고 $a[1]에 영향을 미치지 않습니다. 은 그러나, 참조를 사용하여이 작동하도록 만들 수 있습니다 : 출력

<?php 
$a = array(array(1,2,3), array(4,5,6)); 
$b = &$a[1]; // the & make $b a reference to $a[1] 
$b[0] = 4242; 
print_r($a); 
?> 

:

Array 
(
    [0] => Array 
     (
      [0] => 1 
      [1] => 2 
      [2] => 3 
     ) 

    [1] => Array 
     (
      [0] => 4242 
      [1] => 5 
      [2] => 6 
     ) 

) 

그래서 문자열 $array['doc']['path']을 생성 할 필요가 결코, 당신은 단지 권리를 추구하는 루프를 사용 정렬. 이 비록

+0

잘 모르겠습니다.이 'string'$ array [ 'docs'] [ 'c']가 어떻게 실행될 수 있습니까? 요점은 대괄호를 실행되는 변수로 저장하는 방법을 이해하지 못하는 것입니까? 당신은 정교 할 수 있습니까? –

+0

@ 에릭 : 내 대답에 대한 추가 내용을보십시오. 그게 도움이 되니? –

+0

완벽한! 전구가 켜진 것만! :) 시간 nanothief 주셔서 감사합니다, 그리고 위대한 커뮤니티 stackoverflow 무엇입니까! 감사합니다. –

관련 문제