2009-06-20 10 views
1

J'utilise des tableaux en PHP pour modifier les données XML et les réécrire. Ceci est la structure xml (simplifié à des fins de démonstration):Comment utiliser une variable pour accéder à certains éléments dans un tableau multidimensionnel?

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

En utilisant this code, c'est ensuite analysé et transformé en un tableau multidimensionnel:

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

       ) 

     ) 

) 

long, je sais. Mais maintenant, à la question réelle. Si je veux ajouter un autre fichier dans un sous-dossier appelé dossier2 dans ce cas, ce n'est pas un problème de le faire à la main quand u voir la structure:

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

Maintenant, quand je veux le faire via le fonction qui ne connait qu'un chemin vers le dossier (comme docs/Nom du dossier/Sous-dossier2), l'algorithme doit analyser la structure du tableau (vérifier le nom de chaque [dossier], vérifier s'il existe un ou plusieurs dossiers ['_c '] ou [nombre]) - tout est bon, mais je ne peux pas trouver un moyen de créer une variable qui aurait un chemin " tableau" pour ce nouveau fichier.

Je pensais quelque part le long de ces lignes:

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

Bien sûr, ce n'est pas une syntaxe valide. Donc, comment puis-je faire une variable qui contient un chemin à travers les éléments du tableau? J'ai fait un peu de recherche sur w3c et php.net trouver aucune information utile sur les tableaux multidimensionnels ...

Si quelqu'un a d'autres suggestions concernant la structure, la transformation/manipulation de xml etc. par tous les moyens, je sais que c'est loin d'une manière suffisante de traitement des données.

Merci pour toute entrée,

Erik


Edit: En ce qui concerne la référence, est-il possible de faire référence à la référence? Comme ce serait le moyen de déplacer le «pointeur» à travers un ensemble de tableaux? Quelque chose en tant que tel:

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

Cette syntaxe ne fonctionne pas.

Modifier: La syntaxe fonctionne, peu importe ... Merci à tous pour votre aide les gars!

Répondre

4

Bien que ce n'est pas exactement une réponse à votre question: Au lieu du xml < -> Code de tableau vous pourrait utiliser SimpleXML et ses capacités 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 est plus ou moins votre $ writepath.

+0

L'utilisation de xpath est une très bonne solution à ce problème. Il faut un peu plus de temps pour apprendre que d'utiliser une solution xml -> array, mais je pense que cela serait payant à long terme. –

+0

Bonne réponse! Je suppose que je peux commencer à explorer l'extension SimpleXML car elle est beaucoup plus simple à gérer. Il fait cependant require PHP 5. Merci beaucoup! –

2

L'utilisation de références pourrait aider.

Vous pouvez d'abord écrire une fonction qui renvoie une référence à la partie donnée du tableau pour une chaîne de chemin. Par exemple, get_path_array("Documents") reviendriez $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 

Maintenant, pour ajouter un élément, vous pouvez simplement faire

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

Est-ce que vous cherchez?

(Voir php references pour plus d'infos)

Edit: En réponse au commentaire de Eric (un peu trop dur pour entrer dans un commentaire)

Je pense que vous pouvez être confus sur la façon dont fonctionnent les tableaux. Il n'y a pas vraiment de tableaux multidimensionnels en PHP, juste des tableaux qui stockent d'autres tableaux. Par exemple,

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

Va sortir "4".

Notez que dans le code ci-dessus, $b est une copie de $a[1], en changeant $b n'affectera pas $a[1]. Cependant, l'utilisation des références, cela peut être fait pour travailler:

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

Sorties:

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

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

) 

Donc, il n'y a jamais besoin de générer la chaîne $array['doc']['path'], il suffit d'utiliser une boucle pour rechercher le droit tableau.

+0

Je ne suis pas sûr, comment puis-je générer cette 'chaîne' $ array ['docs'] ['c'] à exécuter? Le point est que je ne comprends pas comment stocker les crochets comme une variable qui serait exécutée? Peux-tu élaborer? –

+0

@Eric: Voir l'addition à ma réponse. Est ce que ça aide? –

+0

Parfait! L'ampoule vient d'allumer! :) Merci pour votre temps nanothief, et quelle super communauté stackoverflow est! Cordialement –