Come utilizzare una variabile per accedere a un determinato elemento all'interno di un array multidimensionale?

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

Domanda

Sto usando array in PHP per modificare i dati XML e riscriverli. Questa è la struttura xml (semplificata a scopo dimostrativo):

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

Utilizzo di questo codice , questo viene quindi analizzato e trasformato in un array multidimensionale:

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

                )

        )

)

Lungo, lo so. Ma ora al problema reale. Se voglio aggiungere un altro file in una sottocartella denominata Sottocartella2 in questo caso, non è un problema farlo manualmente quando vedi la struttura:

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

Ora, quando voglio farlo tramite la funzione che conosce solo un percorso della cartella (come documenti / Nome cartella / Sottocartella2 ), l'algoritmo deve analizzare la struttura dell'array (controlla il nome di ogni [cartella], controlla se ci sono una o più cartelle ['_c'] o [numero]) - tutto bene, ma non riesco a trovare un modo per creare una variabile che avrebbe un " & array quot; percorso per quel nuovo file.

Stavo pensando da qualche parte in questo senso:

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

Naturalmente questa non è una sintassi valida.

Quindi, come posso creare una variabile che contiene un percorso attraverso gli elementi dell'array? Ho fatto un po 'di ricerche su w3c e php.net non trovando informazioni utili su array multidimensionali ...

Se qualcuno ha altri suggerimenti riguardanti la struttura, la trasformazione / manipolazione xml ecc., lo so che è ben lungi dall'essere un modo sufficiente di gestione dei dati.

Grazie per qualsiasi input,

Erik


Modifica: per quanto riguarda il riferimento, è possibile fare riferimento al riferimento? Come sarebbe il modo di spostare il "puntatore" attraverso una serie di array? Qualcosa come tale:

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

Questa sintassi non funziona.

Modifica: la sintassi funziona, non importa ... Grazie per tutto il vostro aiuto ragazzi!

È stato utile?

Soluzione

Anche se questa non è esattamente una risposta alla tua domanda: Invece di xml < - > codice array che potresti usare < a href = "http://php.net/simplexml" rel = "nofollow noreferrer"> SimpleXML e le sue funzionalità 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 è più o meno il tuo $ writepath.

Altri suggerimenti

L'uso dei riferimenti potrebbe essere d'aiuto.

In primo luogo è possibile scrivere una funzione che restituisce un riferimento alla parte data dell'array per una stringa di percorso. Ad esempio, get_path_array("Documents") restituirà $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

Ora per aggiungere un elemento, potresti semplicemente

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

È quello che stavi cercando?

(Vedi riferimenti php per maggiori informazioni)

Modifica: in risposta al commento di Eric (un po 'troppo difficile da inserire in un commento)

Penso che potresti essere confuso su come funzionano le matrici. Non ci sono davvero matrici multidimensionali in php, ma matrici che memorizzano altre matrici. Ad esempio,

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

Produrrà " 4 " ;.

Nota che nel codice sopra, $b è una copia di $a[1], la modifica di $array['doc']['path'] non influirà su <=>. Tuttavia, usando i riferimenti, questo può essere fatto funzionare:

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

Uscite:

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

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

)

Quindi non è mai necessario generare la stringa <=>, basta usare un ciclo per cercare l'array giusto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top