Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    covertire array multidimensionale in xml

    Buon pomeriggio a tutti, devo riordinare il file prova.xml in base al contenuto di un elemento (ord)
    non ho trovato documentazione sul riordinamento diretto di file xml quindi ho provato a riordinare l'array multidimensionale.

    Il file xml è strutturato così:

    codice:
    <?xml version="1.0"?>
    <root>
      <foto>
        <ord>2</ord>
        <descrizione>Descrizione foto 1</descrizione>
        <url>foto/001.jpg</url>
        <permesso>1</permesso>
        <dimensioni>656 x 500</dimensioni>
      </foto>
      <foto>
        <ord>3</ord>
        <descrizione>Descrizione foto 2</descrizione>
        <url>foto/002.jpg</url>
        <permesso>1</permesso>
        <dimensioni>760 x 493</dimensioni>
      </foto>
      <foto>
        <ord>6</ord>
        <descrizione>Descrizione foto 3</descrizione>
        <url>foto/003.jpg</url>
        <permesso>1</permesso>
        <dimensioni>non dichiarate</dimensioni>
      </foto>
    </root>
    ma se uso questo codice

    codice:
    $filexml='prova.xml';
    $xml = simplexml_load_file($filexml);
    
    foreach($xml->foto as $foto){
    	$ord[]=$foto->ord;
    	$permesso[]=$foto->permesso;
    	$descrizione[]=$foto->descrizione;
    	$url[]=$foto->url;
    	$dimensioni[]=$foto->dimensioni;
    }
    
    #array_multisort($ord,SORT_ASC,SORT_NUMERIC, $permesso,SORT_ASC,SORT_NUMERIC, $xml);
    ottengo il messaggio:
    Warning: array_multisort() [function.array-multisort]: Argument #7 is expected to be an array or a sort flag in /var/www/xml/mio/albumXML/riordina.php on line 15

    l'output di print_r($xml) è:

    codice:
    SimpleXMLElement Object
    (
        [foto] => Array
            (
                [0] => SimpleXMLElement Object
                    (
                        [ord] => 20
                        [descrizione] => Descrizione foto 1
                        [url] => foto/001.jpg
                        [permesso] => 1
                        [dimensioni] => 656 x 500
                    )
    
                [1] => SimpleXMLElement Object
                    (
                        [ord] => 30
                        [descrizione] => Descrizione foto 2
                        [url] => foto/002.jpg
                        [permesso] => 1
                        [dimensioni] => 760 x 493
                    )
    
                [2] => SimpleXMLElement Object
                    (
                        [ord] => 10
                        [descrizione] => Descrizione foto 3
                        [url] => foto/003.jpg
                        [permesso] => 1
                        [dimensioni] => non dichiarate
                    )
    				
            )
    
    )
    allora ho provato a modificare il codice così:

    codice:
    $filexml='prova.xml';
    $xml = simplexml_load_file($filexml);
    
    foreach($xml as $xml_2)$xml_arr[]=$xml_2 //creo un nuovo array dall'oggetto $xml
    
    foreach($xml->foto as $foto){
    	$ord[]=$foto->ord;
    	$permesso[]=$foto->permesso;
    	$descrizione[]=$foto->descrizione;
    	$url[]=$foto->url;
    	$dimensioni[]=$foto->dimensioni;
    }
    
    array_multisort($ord,SORT_ASC,SORT_NUMERIC, $permesso,SORT_ASC,SORT_NUMERIC, $xml_arr);
    e in effetti il warning sparisce e se stampo print_r($xml_arr); vedo che l'array è stato ordinato correttamente, il problema è che per salvare le modifiche dovrei trasformare $xml_arr in un nuovo oggetto simplexml oppure in una stringa xml!
    Come fare?
    Esiste un'altro metodo per riordinare file xml con php?
    Sbaglio il procedimento?
    Grazie in anticipo a chi vorrà aiutarmi

  2. #2
    Utente di HTML.it L'avatar di agenti
    Registrato dal
    Feb 2002
    Messaggi
    2,427
    esiste la possbilità di fare sorting tramite xslt.
    Ma dipende da quello che devi fare.
    2000 post e sono più vecchio di 4 anni...
    grazie a tutti....

  3. #3
    Si, ma non voglio filtrare con xslt uso il file xml solo per il pasaggio di dati ed il filtraggio lo faccio via php con output su semplice html.
    Non esiste un modo per per riordinare direttamente da php un file xml o un metodo per convertire un array derivato da simpleXML ad un nuovo oggetto simpleXML?

  4. #4
    Utente di HTML.it L'avatar di agenti
    Registrato dal
    Feb 2002
    Messaggi
    2,427
    io eviterei di usare simpleXml ma aprirei il documento tramite dom usando una classe
    che mi permetta di creare un array dal file xml.

    http://www.phpclasses.org/browse/package/3598.html

    Ma in teoria multisort serve proprio a questo..
    prova a creare un array statico con le dimensioni del tuo file.
    E prova a sortare secondo i vari indici.

    xml a parte , dovrebbe funzionare.
    2000 post e sono più vecchio di 4 anni...
    grazie a tutti....

  5. #5
    Si sicuramente funziona ugualmente anche usando l'array creato, solo che dovrei farlo in ogni pagina perdendo di fatto i benefici dell'xml.
    Per questo mi sembra strano che non sia stata considerata una funzione che crei un xml da una struttura di array corrispondente o che nessuno si sia imbattuto in questo problema.
    Ho frugato anche nelle funzioni DOM ma neanche li esiste una funzione per creare xml da array ma solo da stringa.
    Al limite potrei ricreare il file creando un nuovo oggetto DOM e inserendo gli elementi ordinati.
    Ma?!
    Ora mi guardo il link che hai postato.
    Grazie

  6. #6
    Su http://www.phpclasses.org/ ci sono alcune classi che convertono sia da xml ad array che viceversa.
    Ora le provo. Poi invierò i risultati.
    Se nel frattempo qualcuno potesse avere un'idea per risolvere semplicemente il problema, meglio!
    Eviterei di usare una classe scritta da altri infatti sto scrivendo questo codice per interesse e studio personale.

  7. #7
    Utente di HTML.it L'avatar di agenti
    Registrato dal
    Feb 2002
    Messaggi
    2,427
    dovrai comunque fare qualcosa per elaborare l'xml...

    codice:
      // Converts XML into a PHP array      
      private function xml2array($data)
          {
          $p = xml_parser_create();
          xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1);
          xml_parse_into_struct($p, $data, &$vals, &$index);
          xml_parser_free($p);
          $tree = array();
          $i = 0;
          $tree = $this->GetChildren($vals, $i);
          return $tree;
          }
          
       // A recursive function called by xml2array
       private function GetChildren($vals, &$i)
          {
          $children = array();
          if ($vals[$i]['value']) array_push($children, $vals[$i]['value']);      
          $prevtag = "";
          while (++$i < count($vals))
              {
              switch ($vals[$i]['type'])
                  {
                  case 'cdata':
                    array_push($children, $vals[$i]['value']);
                    break;
                  case 'complete':
                    $children[ strtolower($vals[$i]['tag']) ] = $vals[$i]['value'];
                    break;              
                  case 'open':
                    $j++;
                    if ($prevtag <> $vals[$i]['tag']) 
                        {
                        $j = 0;
                        $prevtag = $vals[$i]['tag'];
                        }
                    $children[ strtolower($vals[$i]['tag']) ][$j] = $this->GetChildren($vals,$i);
                    break;              
                  case 'close':
                    return $children;
                  }
              }
          }
                                 
    }
    2000 post e sono più vecchio di 4 anni...
    grazie a tutti....

  8. #8
    Vedo ora il tuo codice grazie agenti, dopo lo studio.
    per ora ho usato un sistema terra terra.
    Concludendo.
    Ieri ho provato qualche classe di conversione array->XML ma non funzionano con il mio array perchè ha al suo interno oggetti SimpleXmlElement contenenti i dati di ogni elemento <foto>.
    Queste classi si potrebbero usare, come dice giustamente Agenti, trasformando l'XML in array con la classe (senza usare SimpleXML) per poi riconvertirli in XML sempre con la stessa classe.

    Per chi vuole usare SimpleXML può fare così (sarà grezzo ma è efficace):

    codice:
    <?php
     
    $filexml='prova.xml';
    $xml = simplexml_load_file($filexml);
    #echo $xml->asXML();//verifica
    
    foreach($xml->foto as $foto){
    	$foto_arr[]=$foto;
    	$ord[]=$foto->ord;
    	$permesso[]=$foto->permesso;
    	$descrizione[]=$foto->descrizione;
    	$url[]=$foto->url;
    	$dimensioni[]=$foto->dimensioni;
    }
    array_multisort($ord,SORT_ASC,SORT_NUMERIC, $permesso,SORT_ASC,SORT_NUMERIC, $foto_arr);
    
    #POSSO USARE L'ARRAY DIRETTAMENTE...
    
    #Per esempio stampo tutti i dati e le foto con links
    
    $n=count($foto_arr);
    
    #decommentre le righe sotto se si vuole usare
    // for($i=0;$i<$n;$i++)
    // {
    	// echo '<div class="cont_foto">Ord :'.$foto_arr[$i]->ord."
    \n ".'Descrizione :'.$foto_arr[$i]->descrizione."
    \n ".'Permesso :'.$foto_arr[$i]->permesso."
    \n ".'[img]'.$foto_arr[$i]->url.'[/img]descrizione.'" height="100px" />'."
    \n ".'Dimensioni :'.$foto_arr[$i]->Dimensioni."</div>\n 
    ";
    // }
    
    #...OPPURE RICREARE IL FILE XML...
    
    $string_foto="<?xml version=\"1.0\"?>\n";//semmai aggiungete il formato di codifica  ISO-8859-1 o UTF-8
    $string_foto.="<root>\n";
    for($i=0;$i<$n;$i++)
    {
    	$string_foto.="\t<foto>\n";
    	$string_foto.="\t\t<ord>".$foto_arr[$i]->ord."</ord>\n";
    	$string_foto.="\t\t<descrizione>".$foto_arr[$i]->descrizione."</descrizione>\n";
    	$string_foto.="\t\t<url>".$foto_arr[$i]->url."</url>\n";
    	$string_foto.="\t\t<permesso>".$foto_arr[$i]->permesso."</permesso>\n";
    	$string_foto.="\t\t<dimensioni>".$foto_arr[$i]->dimensioni."</dimensioni>\n";
    	$string_foto.="\t</foto>\n";
    }
    $string_foto.="</root>";
    
    //VERIFICA struttura che sarà del file xml
    #echo '<pre>';
    #echo htmlspecialchars($string_foto);
    #echo '<pre>';
    
    #...E SCRIVERLO!
     if(file_put_contents ( $filexml, $string_foto ))echo "Il file XML &egrave; stato scritto correttamente : )";
     else echo "Non &egrave; stato possibile scrivere il file XML : )";
    
    ?>
    Per ricostruire il file io ho usato solo i "valori" ed ho aggiunto a mano i tag <foto><ord><descrizione>....
    si potrebbe fare una funzione più generica usando anche le "chiavi", che sono appunto: ['foto']['ord'][descrizione]...
    considerando un parametro per il nodo radice che in ogni modo andrà passato alla funzione.
    Oppure si potrebbe usare DOM ma credo che convenga solo per strutture XML più comlesse.

    Spero che possa interessare a qulcuno!

    DIMENTICAVO!...
    Non c'entra niente con l'XML! Esiste un sistema per recuperare width e heigh da un file .png, .jpg o .gif?
    Visto che dal codice per l'upload delle foto recupero le dimensioni in byte con $_FILES['userfile']['size'] sarebbe comodo recuperare anche le dimensioni in pixel.
    Meglio se apro una nuova discussione?
    Grazie!

  9. #9
    Utente di HTML.it L'avatar di agenti
    Registrato dal
    Feb 2002
    Messaggi
    2,427
    sembra che si sia una soluzione più elegante..
    ma non testata.

    http://stackoverflow.com/questions/1...with-simplexml
    2000 post e sono più vecchio di 4 anni...
    grazie a tutti....

  10. #10
    Grazie di nuovo agenti appena posso provo anche questo.
    Non ho ancora provato il tuo codice precedente.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.