Foros del Web » Programando para Internet » PHP »

Mostrar X cantidad de noticias

Estas en el tema de Mostrar X cantidad de noticias en el foro de PHP en Foros del Web. Hola, he realizado un código php que lo que hace es leer un RSS de un diario (el codigo XML) y utilizo los datos del ...
  #1 (permalink)  
Antiguo 16/07/2009, 11:26
 
Fecha de Ingreso: diciembre-2006
Mensajes: 294
Antigüedad: 17 años, 4 meses
Puntos: 2
Mostrar X cantidad de noticias

Hola, he realizado un código php que lo que hace es leer un RSS de un diario (el codigo XML) y utilizo los datos del mismo para mostrarlos en mi pagina web.
Esto es para tener noticias actualizadas constantemente sin tener que cambiarlas yo mismo.

El problema es el siguiente: La pagina hay veces que tiene 7 noticias, otras 10... 15... etc... es depende del dia. Entonces lo que hice fue calcularle el total de las noticias y la llame $total. Pero solo quiero mostrar las 3 ultimas noticias, es decir, solo mostrar las 3 primeras que aparecen. Y ahi esta el problema.... Digo que de todas no muestre ninguna solo 3, pero me muestra las 3 ultimas y necesito que me muestre las 3 primeras.....

Aca les dejo el codigo:
Código PHP:
set_time_limit(0);

$file = "http://www.ambito.com/rss/noticias.asp?S=Economía";

$rss_channel = array();
$currently_writing = "";
$main = "";

function startElement($parser, $name, $attrs) {
       global $rss_channel, $currently_writing, $main;
       switch($name) {
           case "RSS":
           case "RDF:RDF":
           case "ITEMS":
               $currently_writing = "";
               break;
           case "CHANNEL":
               $main = "CHANNEL";
               break;
           case "IMAGE":
               $main = "IMAGE";
               $rss_channel["IMAGE"] = array();
               break;
           case "ITEM":
               $main = "ITEMS";
               break;
           default:
               $currently_writing = $name;
               break;
       }
}

function endElement($parser, $name) {
       global $rss_channel, $currently_writing, $item_counter;
       $currently_writing = "";
       if ($name == "ITEM") {
           $item_counter++;
       }
}

function characterData($parser, $data) {
    global $rss_channel, $currently_writing, $main, $item_counter;
    if ($currently_writing != "") {
        switch($main) {
            case "CHANNEL":
                if (isset($rss_channel[$currently_writing])) {
                    $rss_channel[$currently_writing] .= $data;
                } else {
                    $rss_channel[$currently_writing] = $data;
                }
                break;
            case "IMAGE":
                if (isset($rss_channel[$main][$currently_writing])) {
                    $rss_channel[$main][$currently_writing] .= $data;
                } else {
                    $rss_channel[$main][$currently_writing] = $data;
                }
                break;
            case "ITEMS":
                if (isset($rss_channel[$main][$item_counter][$currently_writing])) {
                    $rss_channel[$main][$item_counter][$currently_writing] .= $data;
                } else {
                    $rss_channel[$main][$item_counter][$currently_writing] = $data;
                }
                break;
        }
    }
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)));
    }
}
xml_parser_free($xml_parser);

$total = count($rss_channel["ITEMS"]);
$item_counter = $total-3;

if (isset($rss_channel["ITEMS"])) {
    if (count($rss_channel["ITEMS"]) > 0) {
        for($i = $item_counter;$i < count($rss_channel["ITEMS"]);$i++) {

$titulo = $rss_channel["ITEMS"][$i]["TITLE"];
$descripcion = $rss_channel["ITEMS"][$i]["DESCRIPTION"];
$fecha = $rss_channel["ITEMS"][$i]["PUBDATE"];
$link = $rss_channel["ITEMS"][$i]["LINK"];

$titulo = nl2br($titulo);
$titulo = str_replace('á','&aacute;',$titulo);
$titulo = str_replace('é','&eacute;',$titulo);
$titulo = str_replace('í','&iacute;',$titulo);
$titulo = str_replace('ó','&oacute;',$titulo);
$titulo = str_replace('ú','&uacute;',$titulo);
$titulo = str_replace('Á','&Aacute;',$titulo);
$titulo = str_replace('É','&Eacute;',$titulo);
$titulo = str_replace('Í','&Iacute;',$titulo);
$titulo = str_replace('Ó','&Oacute;',$titulo);
$titulo = str_replace('Ú','&Uacute;',$titulo);
$titulo = str_replace('ñ','&ntilde',$titulo);
$titulo = str_replace('Ñ','&Ntilde',$titulo);

$descripcion = nl2br($descripcion);
$descripcion = str_replace('á','&aacute;',$descripcion);
$descripcion = str_replace('é','&eacute;',$descripcion);
$descripcion = str_replace('í','&iacute;',$descripcion);
$descripcion = str_replace('ó','&oacute;',$descripcion);
$descripcion = str_replace('ú','&uacute;',$descripcion);
$descripcion = str_replace('Á','&Aacute;',$descripcion);
$descripcion = str_replace('É','&Eacute;',$descripcion);
$descripcion = str_replace('Í','&Iacute;',$descripcion);
$descripcion = str_replace('Ó','&Oacute;',$descripcion);
$descripcion = str_replace('Ú','&Uacute;',$descripcion);
$descripcion = str_replace('ñ','&ntilde',$descripcion);
$descripcion = str_replace('Ñ','&Ntilde',$descripcion);

$fecha = nl2br($fecha);
$fecha = str_replace('Mon','Lunes',$fecha);
$fecha = str_replace('Tue','Martes',$fecha);
$fecha = str_replace('Wed','Miercoles',$fecha);
$fecha = str_replace('Thu','Jueves',$fecha);
$fecha = str_replace('Fri','Viernes',$fecha);
$fecha = str_replace('Sat','Sabado',$fecha);
$fecha = str_replace('Sun','Domingo',$fecha);
$fecha = str_replace('-0300','',$fecha);

            if (isset($rss_channel["ITEMS"][$i]["LINK"])) { ?>
            
            <div id="titulo_con_link" align="justify">
            <a href="
<?=$link;?>
            " target="_bank" id="link">
<?=$titulo;?>
            </a>
            </div>

<? } else { ?>

            <div id="titulo_sin_link" align="justify">
<?=$titulo;?>
            </div>

<? ?>

             <div id="fecha" align="right">
<?=$fecha?>
             </div>

             <div id="noticia" align="justify">
<?=$descripcion;?>
             </div>

             <div id="linea"><img src="imagenes/linea.jpg" width="4" height="5"></div>


<? }
    } else {
        print (
"Error de lectura");
    }
}
Gracias
  #2 (permalink)  
Antiguo 16/07/2009, 11:32
Avatar de Ronin46  
Fecha de Ingreso: junio-2009
Mensajes: 398
Antigüedad: 14 años, 10 meses
Puntos: 8
Respuesta: Mostrar X cantidad de noticias

Cita:
Iniciado por gesking Ver Mensaje
Pero solo quiero mostrar las 3 ultimas noticias, es decir, solo mostrar las 3 primeras que aparecen. Y ahi esta el problema.... Digo que de todas no muestre ninguna solo 3, pero me muestra las 3 ultimas y necesito que me muestre las 3 primeras.....
Desde mi punto de vista todo lo que te he "quoteado" me parece una contradicción, sobre todo lo que te marqué en negrita. ¿Qué quieres hacer realmente?
  #3 (permalink)  
Antiguo 16/07/2009, 11:34
 
Fecha de Ingreso: mayo-2006
Ubicación: Bogotá
Mensajes: 2.061
Antigüedad: 18 años
Puntos: 50
Respuesta: Mostrar X cantidad de noticias

Depronto es que el array las carga al revez inicie $i en 0 y que le haga el proceso tres veces y le debe funcionar.

la otra seria iniciar $i = count($rss_channel["ITEMS"]; e ir reduciendo $i.

pero veo mas viable la primera opcion.

Me cuenta si le sirvio, o si tiene duds
  #4 (permalink)  
Antiguo 16/07/2009, 13:12
Avatar de Ronin46  
Fecha de Ingreso: junio-2009
Mensajes: 398
Antigüedad: 14 años, 10 meses
Puntos: 8
Respuesta: Mostrar X cantidad de noticias

Creo que me estoy liando, pero vamos a intentarlo

opción A) Si el array está ordenado por fecha de más reciente a más antiguo y quieres mostrar lo más reciente, sería ir desde $i=0 a $i=3

opción B) Si el array está ordenado por fecha de más reciente a más antiguo y quieres mostrar lo más antiguo, sería ir desde $i=cantidaditems(array) a $i=cantidaditems(array) - 3

opción C) Si el array está ordenado por fecha de más antiguo a más reciente y quieres mostrar lo más antiguo, sería igual que la opción A

opción D) Si el array está ordenado por fecha de más antiguo a más reciente y quieres mostrar lo más reciente, sería igual que la opción B

¿Es eso lo que preguntas?
  #5 (permalink)  
Antiguo 17/07/2009, 08:14
 
Fecha de Ingreso: diciembre-2006
Mensajes: 294
Antigüedad: 17 años, 4 meses
Puntos: 2
Respuesta: Mostrar X cantidad de noticias

Perdonen, me expresé mal....

Digo que quiero mostrar las 3 ultimas noticias, pero en la pagina se muestran de la mas reciente a la mas antiguas, es decir, esas 3 ultimas noticias se muestran primero en la pagina....

Obviamente no me di cuenta, me laburé el código y ahora me veo en figuritas, estoy confundido jejejeje

El problema es que me muestra las 3 ultimas noticias de la pagina y necesito mostrar las 3 primeras...

EJ:

noticia 05

noticia 04

noticia 03

noticia 02

noticia 01

Las 3 ultimas publicadas son la 05, 04 y 03 y se muestran a lo primero. Pero tengo que mostrar las 3 primeras que figuran en la pagina.
  #6 (permalink)  
Antiguo 17/07/2009, 08:40
 
Fecha de Ingreso: diciembre-2006
Mensajes: 294
Antigüedad: 17 años, 4 meses
Puntos: 2
Respuesta: Mostrar X cantidad de noticias

Jajaja perdonen... que tonto que sea =P

Ahora que lo pense con mente fria encontre bien mi problema......

Aca ta la solucion:

Código PHP:
$total count($rss_channel["ITEMS"]); 

if (isset(
$rss_channel["ITEMS"])) { 
    if (
$total 0) { 
        for(
$i 0;$i <= 3;$i++) { 
El problema ahora es que en este momento, el RSS de donde tomo los datos publicó 11 noticias. Bueno, ahora me muestra en este orden:





y me tendria que mostrar solo la 1º, 2º y 3º

Es raro... un misterio
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 17:25.