Obtener el indice con foreach de un arhivo xml

Estoy intentando obtener los indices de las galeria que tengo en una archivo xml, para mostrarlo en un <select>
El archivo xml es el siguiente..
Estoy intentando utilizar "foreach" pero lo que me trae, es dos veces galleria, pero eso esta bien, lo que pasa es que trae son los nombres, pero yo quiero indices, 0 y 1
Archivo xml
[php]<?xml version="1.0"?>
<content>
 <gallery Name="Hostal" Folder="Gallery/hostal">
 <image Thumb="thumb0.jpg" Large="0.jpg" Caption="Hostal Regina" Colour="181f0a">
    <comentarios><![CDATA[
<p>Hostal Regina comentarios</p>
]]></comentarios>
    </image>
    <image Thumb="thumb1.jpg" Large="1.jpg" Caption="Hostal Regina" Colour="181f0a">
    <comentarios><![CDATA[
<p>Hostal Regina</p>
]]></comentarios>
    </image>
  </gallery>
<gallery Name="Vistas" Folder="Gallery/nerja">
    <image Thumb="thumb0.jpg" Large="0.jpg" Caption="Vista Nocturna" Colour="eeeeeee">
    <comentarios><![CDATA[
<p>Vista Nocturna realizada por Diego Palomo</p>
]]></comentarios>
    </image>
<image Caption="eeeeeee"><comentarios>http://php-design-patterns.com</comentarios></image>
</gallery>
</content>
[/php]
archivo formulario select
[php]<select name="action">
<option value="">Escoger de la Lista</option>
<?php
$source = 'content.xml';
// load as string
$xmlstr = file_get_contents($source);
$sitemap = new SimpleXMLElement($xmlstr);
// load as file
$sitemap = new SimpleXMLElement($source,null,true);
foreach($sitemap->gallery as $index=>$content) {
$atributo = $content->attributes();
echo "<option value='".$index."'>".$index. "</option>";///in value no show index
}
?>
</select>[/php]

3 respuestas

Respuesta
1
¿Y dónde están los indices?
<image Thumb="thumb0.jpg" Large="0.jpg" Caption="Hostal Regina" Colour="181f0a">
    <comentarios><![CDATA[
<p>Hostal Regina comentarios</p>
]]></comentarios>
    </image>
no hay indices, quiero decir:
Thumb=imagen pequeña
Large=imagen completa
Caption= nombre de la imagen
color=Un color
cometnarios= comentarios
No hay ninguna información más sobre la imagen
Tienes razón el indice no lo trae si no, cuando me refiero al indice me refiero que hay dos galerías, esas galería se modifican con este código, pero para eso tengo que ue indicarle el indice
te muestro el código
$indice=1;
$image = $sitemap->gallery[$indice]->addChild('image');
Lo que intento hacer es que en el formulario especialmente en el select, me traigo los valores de los indices para así saber que galleria modificar, la modificación me sale bien el problema es que yo quiero el usuario elija la galleria, en el select.
Ok, como no tienes los indices de las galerías, lo que te puedes hacer es un contrador:
$contador=0;
foreach($sitemap->gallery as $index=>$content) {
$atributo = $content->attributes();
echo "<option value='".$contador."'>".$index. "</option>";///in value no show index
$contador++;
}
o si modificas el xml con
<gallery Name="Hostal" Folder="Gallery/hostal" id="0">
Podrás acceder al id con $content['id']
Tu dos ideas son buenas, voy a utilizar por ahora el contador, pero lo de modificar el xml es muy buena idea,, la verdad que sin ti no lo hubiera logrado ya que he preguntado en otros sitios y no me lo han resuelto, y tu lo sencillo que lo has visto
Respuesta
1
Échale un ojo a la documentación oficial de SimpleXML.
Como podrás ver, como el objeto SimpleXML es iterable y accesible, el foreach retorna los índices del array que estás iterando (en este caso son objetos "gallery").
Hay 2 opciones, una que es añadir un atributo 'id' a cada tag gallery, y acceder a ese valor (bastante recomendable), y otra que sería utilizar una variable $i inicializada a 0 fuera del bucle foreach, e incrementada en cada paso del bucle.
Te pongo el código de ejemplo de la primera opción:
--- CÓDIGO ---
XML (recortado):
<?xml version="1.0"?>
<content>
    <gallery Name="Hostal" Folder="Gallery/hostal" id="0">
    </gallery>
    <gallery Name="Vistas" Folder="Gallery/nerja" id="1">
    </gallery>
</content>
PHP (muy similar al tuyo, observa dentro del foreach cómo se accede a los atributos de la tag gallery):
<select name="action">
    <option value="">Escoger de la Lista</option>
    <?php
    $source = 'galeria.xml';
    // load as file
    $sitemap = new SimpleXMLElement($source,null,true);
    foreach($sitemap->gallery as $gallery) {
        $value = $gallery['id'];
        $label = $gallery['Name'];
        echo "<option value='".$value."'>".$label. "</option>";///in value no show index
    }
    ?>
</select>
---- // CÓDIGO ----
En el código PHP estás inicializando 2 veces la variable $sitemap, que no necesitas (es mejor la opción de "load as file").
Respuesta
1
No se a que te refieres con los indices, porque no están en el XML. Si lo vas a hacer con un foreach, asigna al primero el indice 0 y así consecutivamente, sumando uno cada vuelta del FOR.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas