Foros del Web » Programando para Internet » PHP »

¿Como ordenar un xml de varios atributos con PHP?

Estas en el tema de ¿Como ordenar un xml de varios atributos con PHP? en el foro de PHP en Foros del Web. Trato de ordenar un xml con varios atributos pero no he podido, el siguiente codigo lo uso para ordenar un atributo: Código PHP: $sxml  =  ...
  #1 (permalink)  
Antiguo 13/12/2013, 21:10
 
Fecha de Ingreso: septiembre-2010
Mensajes: 66
Antigüedad: 13 años, 7 meses
Puntos: 2
Pregunta ¿Como ordenar un xml de varios atributos con PHP?

Trato de ordenar un xml con varios atributos pero no he podido, el siguiente codigo lo uso para ordenar un atributo:

Código PHP:
$sxml simplexml_load_file("nombres.xml"); 
$res $sxml->xpath("/usuarios/id"); 

$posts = array(); 

foreach(
$res as $art2

    
$posts[] = (string) $art2->nombre



sort($posts); 

$clength=count($posts); 
for(
$x=0;$x<$clength;$x++) 
   { 
   echo 
$posts[$x]; 
   echo 
"<br>"
   } 
Estoy tratando de organizarlos con varios atibutos con el siguiente codigo pero no he podido:

Código PHP:

$sxml 
simplexml_load_file("nombres.xml");
$res $sxml->xpath("/usuarios/id");
function 
ordenar ($t1$t2
{
    return 
strcmp($t1['nombre'], $t2['nombre']);
    }
usort($res'ordenar');

foreach( 
$res as $art 
         {
echo 
$art->nombre;
echo 
$art->edad;
echo 
$art->sexo;
echo 
$art->profesion;
         } 
Me arroja los resultados pero sin ordenarlos por nombre.

El xml es de la forma:

Código:
<!--?xml version="1.0" encoding="iso-8859-1"?-->

<usuarios>

<id>		
<nombre>Felipe Guzman</nombre>	
<edad>24</edad>
<sexo>Masculino</sexo>
<profesion>Estudiante</profesion>
</id>

<id>		
<nombre>Ivan garcia</nombre>		
<edad>26</edad>
<sexo>Masculino</sexo>
<profesion>Contador</profesion>
</id>
	
</usuarios>
Agradezco su colaboracion
  #2 (permalink)  
Antiguo 15/12/2013, 12:10
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: ¿Como ordenar un xml de varios atributos con PHP?

php tiene funciones nativas para esto que ahora mismo no recuerdo, pero puedes hacer algo a manuela como esto:
Código PHP:
Ver original
  1. <?php
  2. function getBloquesXML($xml, $bloque)
  3. {  
  4.     $tmp_bloques = array();
  5.     $ini = true;
  6.     while($ini !== false)
  7.     {
  8.         $ini = strpos($xml, '<'.$bloque.'>');
  9.         $fin = strpos($xml, '</'.$bloque.'>'); 
  10.         $tmp = substr($xml, ($ini+strlen('<'.$bloque.'>')), $fin-($ini+strlen('<'.$bloque.'>')));
  11.         if(trim($tmp) != '')
  12.             $tmp_bloques[] = $tmp;
  13.         $xml = substr($xml, $fin-($ini+strlen('<'.$bloque.'>')));
  14.     }
  15.     return $tmp_bloques;
  16. }
  17.  
  18. function ordenarXML($xml, $seccion, $bloque, $propiedad, $forma)
  19. {
  20.     $conXML = array('','');
  21.     $ini = strpos($xml, '<'.$seccion.'>');
  22.     $fin = strpos($xml, '</'.$seccion.'>');
  23.    
  24.     $xmlOrdenado = substr($xml, 0, ($ini+strlen('<'.$seccion.'>')));
  25.     $conXML[0] = getBloquesXML($xml, $seccion);
  26.     $conXML[1] = substr($xml, $fin);
  27.    
  28.     $bloques = getBloquesXML($conXML[0][0], $bloque);
  29.     $tmp_arr_val = array();
  30.     $tmp_arr_ind = array();
  31.     foreach($bloques as $indice => $unBloque)
  32.     {
  33.         $tmp_arr_val[] = getBloquesXML($unBloque, $propiedad)[0];
  34.         $tmp_arr_ind[] = $indice;      
  35.     }
  36.     array_multisort($tmp_arr_val, $tmp_arr_ind);
  37.    
  38.     $ini = 0;
  39.     $fin = 0;
  40.     if($forma == 'DESC')
  41.     {
  42.         for($ind=0,$fin=count($tmp_arr_ind); $ind < $fin; $ind++)
  43.             $xmlOrdenado .= $bloques[$tmp_arr_ind[$ind]];
  44.     } else {   
  45.         for($ind=count($tmp_arr_ind)-1, $fin=0; $ind>=$fin; $ind--)
  46.             $xmlOrdenado .= $bloques[$tmp_arr_ind[$ind]];
  47.     }      
  48.    
  49.     $xmlOrdenado .= $conXML[1];
  50.    
  51.     return $xmlOrdenado;
  52. }
  53. // La llamarias asi:
  54. echo(ordenarXML($xml, 'usuarios', 'id' ,'nombre', 'ASC'));
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Etiquetas: sort, xml
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:47.