2009-06-20 7 views
1

Ich verwende Arrays in PHP, um XML-Daten zu modifizieren und zurückzuschreiben. Dies ist die XML-Struktur (zu Demonstrationszwecken vereinfacht):Wie verwende ich eine Variable, um auf ein bestimmtes Element innerhalb eines mehrdimensionalen Arrays zuzugreifen?

<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> 

Mit this code, dies wird dann in ein mehrdimensionales Array analysiert und transformiert:

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

       ) 

     ) 

) 

Langwierige, ich weiß. Aber jetzt zum eigentlichen Problem. Wenn ich eine andere Datei in einen Unterordner namens Subfolder2 in diesem Fall hinzufügen will, dann ist es kein Problem, es von Hand zu tun, wenn u die Struktur sehen:

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

Nun, wenn ich es über das tun will Funktion, die nur einen Pfad zum Ordner kennt (wie docs/Ordnername/Unterordner2), muss der Algorithmus die Array-Struktur analysieren (überprüfen Sie den Namen jedes [Ordners], prüfen Sie, ob es einen oder mehrere Ordner ['_c '] oder [Nummer]) - alles gut, aber ich kann keine Möglichkeit finden, eine Variable zu erstellen, die einen Pfad " Array" für diese neue Datei haben würde.

Ich dachte, irgendwo in dieser Richtung:

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

Natürlich ist dies keine gültige Syntax.

Also, wie kann ich eine Variable erstellen, die einen Pfad durch die Array-Elemente enthält? Ich habe ein wenig Forschung über w3c und php.net gefunden keine hilfreiche Informationen über multidimensionale Arrays ...

Wenn jemand irgendwelche anderen Vorschläge in Bezug auf Struktur, Xml Transformation/Manipulation usw. auf alle Fälle, ich weiß, es ist weit von der ausreichenden Art der Datenverarbeitung.

Vielen Dank für jede Eingabe,

Erik


Edit: die Referenz In Bezug auf, ist es möglich, den Bezug zu verweisen? Wie würde man so den "Zeiger" durch eine Reihe von Arrays bewegen? Etwas als solche:

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

Diese Syntax funktioniert nicht.

Edit: Die Syntax funktioniert, egal ... Vielen Dank für all Ihre Hilfe Jungs!

Antwort

4

Obwohl dies nicht genau eine Antwort auf Ihre Frage: Anstelle des xml < -> Array Code Sie konnte Verwendung SimpleXML und seine XPath-Funktionen.

<?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 ist mehr oder weniger Ihr $ Schreibpfad.

+0

Die Verwendung von Xpath ist eine sehr nette Lösung für dieses Problem. Es dauert etwas länger zu lernen, als nur eine xml -> Array-Lösung zu verwenden, aber ich denke, es würde sich auf lange Sicht auszahlen. –

+0

Große Antwort! Ich denke, ich kann anfangen, die SimpleXML-Erweiterung zu erkunden, da es viel einfacher zu verwalten ist. Es tut jedoch require PHP 5. Danke vielmals! –

2

Verwendung von Referenzen kann helfen.

Sie könnten zuerst eine Funktion schreiben, die einen Verweis auf den angegebenen Teil des Arrays für eine Pfadzeichenfolge zurückgibt. Zum Beispiel würde get_path_array("Documents") Rückkehr $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 

Jetzt ein Element hinzufügen, die Sie gerade

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

tun können, ist es das, was Sie suchen?

(Siehe php references für weitere Informationen)

Edit: In Antwort auf Erics Kommentar (ein bisschen zu schwer passen in einen Kommentar)

Ich glaube, Sie verwechseln kann, wie Arrays arbeiten. Es gibt nicht wirklich so etwas wie multidimensionale Arrays in PHP, nur Arrays, die andere Arrays speichern. Beispiel:

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

Gibt "4" aus.

Beachten Sie, dass in dem obigen Code, $b eine Kopie von $a[1] ist, $b Wechsel nicht $a[1] beeinflussen.

<?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); 
?> 

Ausgänge: jedoch Referenzen verwenden, können diese Arbeit gemacht werden

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

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

) 

So gibt es nie eine Notwendigkeit, die Zeichenfolge $array['doc']['path'], die Sie gerade eine Schleife verwenden, um zu erzeugen das Recht zu suchen Array.

+0

Ich bin mir nicht sicher, wie kann ich diese 'string' $ array ['docs'] ['c'] zur Ausführung erzeugen? Der Punkt ist, ich verstehe nicht, wie man eckige Klammern als eine Variable speichert, die ausgeführt würde? Kannst du es ausarbeiten? –

+0

@Eric: Siehe den Zusatz zu meiner Antwort. Hilft das? –

+0

Perfekt! Die Glühbirne hat gerade angezündet! :) Danke für deine Zeit Nanothief, und was für eine tolle Community Stackoverflow ist! Grüße –

Verwandte Themen