변수를 사용하여 다차원 배열 내의 특정 요소에 액세스하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1021281

문제

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>

사용 이 코드, 이것은 구문 분석되어 다차원 배열로 변환됩니다.

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] => 
                        )

                )

        )

)

길고 알아요. 그러나 이제 실제 문제에. 전화 하위 폴더에 다른 파일을 추가하려면 subfolder2 이 경우 구조를 볼 때 손으로 수행하는 것은 문제가되지 않습니다.

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

이제 폴더로가는 경로 만 알고있는 함수를 통해 수행하고 싶을 때 ( 문서/폴더 이름/subfolder2), 알고리즘은 배열 구조를 분석해야합니다 (각 [폴더]의 이름을 확인하고 하나 이상의 폴더 [ '_c'] 또는 [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
)

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

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

도움이 되었습니까?

해결책

이것은 아니지만 바로 그거죠 귀하의 질문에 대한 답변 : XML <-> 배열 코드 대신 귀하에게 ~할 수 있었다 사용 단순 렉스 그리고 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입니다.

다른 팁

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

먼저 경로 문자열에 대한 배열의 주어진 부분에 대한 참조를 반환하는 함수를 작성할 수 있습니다. 예를 들어, 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

이제 요소를 추가하려면

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

그게 당신이 찾고 있던 것입니까?

(보다 PHP 참조 더 많은 정보를 위해서)

편집 : Eric의 의견에 대한 답변으로 (의견에 맞추기가 너무 어렵습니다)

배열의 작동 방식에 대해 혼란 스러울 수 있다고 생각합니다. PHP에는 다중 배열 어레이와 같은 것이 실제로 없으며 다른 배열을 저장하는 배열 만 있습니다. 예를 들어,

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

"4"를 출력합니다.

위 코드에서 $b 사본입니다 $a[1], 바꾸다 $b 영향을 미치지 않습니다 $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'], 당신은 루프를 사용하여 올바른 배열을 찾습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top