entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Meter en un array la salida de una consulta de varios documentos con Foreach.

Hola, tengo una duda con PHP, muchas gracias con antelación.

Tengo varios documentos XML con datos de CDs de música, en los cuales necesito sacar el mismo dato de cada uno (Nombres de las canciones). El código me funciona para hacer esto, pero ahora necesito que cada 10 canciónes me lo meta en un <div>(para css) diferente. Lo que me pasa es que el foreach me hace un array por cada fichero que lee(un array por cd) y no uno de todos(uno con todas las canciones de todos los cds) y así poder contar el número de canciones y separarlas cada 10. ¿Alguna sugerencía?
Espero haberme explicado bien :S

//Listado de ficheros
foreach(glob($url .'*.xml') as $archives) {

//Abrimos fichero xml
$cdarchive=simplexml_load_file($archives);

    //Mostramos nombre de las canciones
foreach ($cdarchive->songs->song as $cdsong){
    echo $count;
    echo "<div class='slide><div class'left>";
    echo $cdsong->title." ";
    if (isset($cdsong->length))
    echo "(".$cdsong->length.")";
    if (isset($cdsong->feat))
    echo "[feat.".$cdsong->feat."]";
    echo "</br>";
    echo "</div></div>";

}

0voto

carlossevi comentado

¿Podrías poner un ejemplo del HTML generado y del que te gustaría generar? No he terminado de entender la pregunta. Para que entendamos cómo tienes el XML también nos podrías pegar el resultado de print_r($cdarchive); después del load.

De todas formas hay un error de HTML en la salida de:

echo "<div class='slide><div class'left>";

Puedes cambiarlo por:

echo '<div class="slide"><div class="left">';

0voto

TamaraZambrana comentado

Hola Muchas gracias por comentar, no es un error, en el echo no puedo poner doble comillas sino simples, pero esto funciona.

La consulta la hago sobre varios documentos xml, de los cuales cada uno tiene un numero de canciones diferentes. Como se ve en mi codigo abro un documento xml, y luego lo recorro con el foreach y saco los datos. Esto lo hago por cada documento, por lo tanto por cada documento obtengo un array diferente. Lo que me gustaría hacer es que todos los resultados, todas las canciones de todos los cds, meterlos en el mismo array y así despues poder separalos.

0voto

carlossevi comentado

La respuesta te la he puesto a parte, pero respecto a las comillas, para definir cadenas de texto en PHP puedes utilizar tanto las simples como las dobles. Dentro de las dobles puedes meter las simples como un caracter más y al revés sucede lo mismo.

Como en este caso necesitas generar las dobles para que el HTML sea válido, te será más cómodo encerrar la cadena entre comillas simples, aunque siempre podrías "escaparlas" entre las dobles. Como ejemplo estas dos líneas hacen lo mismo:

echo '<div class="slide"><div class="left">';
echo "<div class=\"slide\"><div class=\"left\">";

Como corolario, lo bueno de las comillas simples es que puedes poner variables directamente dentro de la cadena y se sustituyen automáticamente por su valor.

1 Respuesta

2votos

carlossevi Puntos63580

Si lo que quieres es unir todas las lecturas de tus ficheros en un único array puedes utilizar la función de PHP array_merge(). Documentación.

Ejemplo simple de uso:

$cdarchive1 = simplexml_load_file($archivo1);
$cdarchive2 = simplexml_load_file($archivo2);
$cdarchive3 = simplexml_load_file($archivo3);
$cdarchive = array_merge($cdarchive1,$cdarchive2,$cdarchive3);

Lógicamente podrías complicarlo un poquito más metiéndolo en un bucle para ir acumulando:

$cdarchive = array();
// Lista de archivos a importar:
$archivos = array("archivo1.xml", "archivo2.xml", "archivo3.xml");
foreach($archivos as $archivo) {
    // Importar en array temporal y acumular:
    $cdarchive_temp = simplexml_load_file($archivo);    
    $cdarchive = array_merge($cdarchive, $cdarchive_temp);
}

0voto

Leonardo-Tadei comentado

Hola Carlos!

estaba pensado en la misma solución de poner un array_merge() adentro del bucle para ir "sumando" los vectores sin repeticiones.

+1 de mi parte!

0voto

carlossevi comentado

Muchas gracias, incluso por tomarte la molestia de comentarlo. Aunque sea algo simple, me alegra coincidir contigo dado tu gran dominio de este tema.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta