변수를 사용하여 다차원 배열 내의 특정 요소에 액세스하는 방법은 무엇입니까?
-
06-07-2019 - |
문제
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 기능.
$ PathToparentElement는 귀하의 $ writepath입니다.<?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();
다른 팁
참조를 사용하면 도움이 될 수 있습니다.
먼저 경로 문자열에 대한 배열의 주어진 부분에 대한 참조를 반환하는 함수를 작성할 수 있습니다. 예를 들어, 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']
, 당신은 루프를 사용하여 올바른 배열을 찾습니다.