Foros del Web » Programando para Internet » PHP »

Arrays multidimensionales... dentro de bucles.

Estas en el tema de Arrays multidimensionales... dentro de bucles. en el foro de PHP en Foros del Web. Hola de nuevo, buff, no sé ni como explicar esto, tengo un problemilla con arrays y creo que lo mismo lo hago muy complicado. Pondré ...
  #1 (permalink)  
Antiguo 28/08/2004, 16:00
Avatar de Covids0020  
Fecha de Ingreso: septiembre-2003
Ubicación: España
Mensajes: 217
Antigüedad: 20 años, 6 meses
Puntos: 1
Arrays multidimensionales... dentro de bucles.

Hola de nuevo, buff, no sé ni como explicar esto, tengo un problemilla con arrays y creo que lo mismo lo hago muy complicado.

Pondré todo el código que uso para que se vea todo, pero antes me explicaré:

Intento hacer un ranking de paises del medallero de Atenas 2004, bueno, en realidad es un parseo (si se le puede llamar así ), del archivo oficial de la web.
Una vez aislada la parte de código que me interesa de dicho archivo, creo yo mi tabla y muestro los datos como yo prefiera.

Recorro el archivo linea a linea y estoy intentando crear un array con los datos de cada pais, pero no puedo acceder a ese array desde fuera del bucle que recorre el archivo, es decir:

Yo creo un array dentro de un bucle for($i...), para poder acceder al array he de asignarle indices con $i, y en este array[$i] estan los elementos de cada pais, así, el array queda, por ejemplo:
$paises[$i][nombre]
$paises[$i][ranking]
etc...
Pero fuera del bucle no puedo llamar a $paises[1][nombre], etc...
no caigo como hacerlo, he pensado en que con cada iteracion del bucle establecer ese array como una variable global o algo así, ya que luego los usaré en otros script pero creo que eso no va.
También podría intentar guardarlo en una DB pero no se actualizaría y... es mucho consumo no?.
Bueno, como veis los arrays me traen de cabeza y estoy muyyyy pegado en el tema.
Os pongo el código, ok?:
Código PHP:
<?php
$origen_url 
"http://www.marca.com/atenas2004/medallero/medallero.html";
// Verificamos el enlace
if (valida_url($origen_url))
{
$archivo file($origen_url);
$lineas count($archivo);

echo 
'
<table class="medallero">
  <tr class="definicion">
    <td>Posicion</td>
    <td>Pais</td>
    <td>Oro</td>
    <td>Plata</td>
    <td>Bronce</td>
    <td>Total</td>
  </tr>
'
;
/////////////////////////////////////////////////
// Buscamos paises que usan 2 celdas para el nombre      
  
for($i=0$i<$lineas$i++)
  {
      if (
eregi("Zelanda",$archivo[$i]))
      {
      
$nueva_zelanda $i-3;
      
//echo "Línea $nueva_zelanda: Nueva Zelanda<br />";
      
}
      if (
eregi("Serbia",$archivo[$i]))
      {
      
$servia $i-2;
      
//echo "Línea $servia: Serbia<br />";
      
}

  }
///////////////////////////////////////////////
      
  
for($i=0$i<$lineas$i++)
  {
    
// Buscamos donde comienza la columna de medallas
    
if (eregi("<tr bgcolor=\"#EEEEEE\">",$archivo[$i]))
    {
    
//echo "Línea $i: ENCONTRADA!!<br />";
      // Buscamos si están Nueva Zelanda
      // o Servia, pues usan otra celda para su segundo nombre
      
if (($i==$nueva_zelanda) or ($i==$servia))
      {
      
// Obtenemos datos para ponerlos en un array
      
$ranking strip_tags($archivo[$i+1]);
      
$pais strip_tags($archivo[$i+2]).' '.strip_tags($archivo[$i+3]);
      
$orostrip_tags($archivo[$i+4]);
      
$plata strip_tags($archivo[$i+5]);
      
$bronce strip_tags($archivo[$i+6]);
      
$total $oro+$plata+$bronce;
      }
      else
      {
      
// Obtenemos datos para ponerlos en un array
      
$ranking strip_tags($archivo[$i+1]);
      
$pais strip_tags($archivo[$i+2]);
      
$orostrip_tags($archivo[$i+3]);
      
$plata strip_tags($archivo[$i+4]);
      
$bronce strip_tags($archivo[$i+5]);
      
$total $oro+$plata+$bronce;
      }
      
// Crearemos un array asociativo
      
$paises = array("$i"=>
      array(
"nombre"=>"$pais","ranking"=>"$ranking","oro"=>"$oro","plata"=>"$plata","bronce"=>"$bronce","total"=>"$total")
      );
      
//////////////////////////////////////////////////////////
      
echo "
      <tr>
        <td>"
.$paises[$i][ranking]."</td>
        <td>"
.$paises[$i][nombre]."</td>
        <td>"
.$paises[$i][oro]."</td>
        <td>"
.$paises[$i][plata]."</td>
        <td>"
.$paises[$i][bronce]."</td>
        <td>"
.$paises[$i][total]."</td>
      </tr>
      "
;
    }
  }
echo 
'</table>';
}
else
{
echo 
'<p>El URL indicado:<br />
<a href="'
.$origen_url.'" title="'.$origen_url.'" target="_blank">'.$origen_url.'</a><br />
no se encuentra ya disponible, es posible que haya sido movido o borrado.</p>'
;
}
?>
Lo que me gustaría tener sería algo así:
Código PHP:
$array_pais = array("$pais"=>array("ranking"=>"$ranking","oro"=>"$oro","plata"=>"$plata","bronce"=>"$bronce","total"=>"$total")); 
Dentro del bucle no tiene ninguna utilidad, ya que tendría que llamar a cada indice de pais o crear un bucle para recorrer el array con paises y no va fuera del bucle que es donde me interesaría tener algo como:

$array_pais[Estados Unidos];

Y después, esto ya no es tan necesario, poder tener ese array como global o algo así, pero esto es lo de menos.


Os estaría increiblemente agradecido, una ayudilla please.

Un saludo.
__________________
"La sabiduría comienza donde acaba el conocimiento". Yaris.
http://www.culturadigital.org

Última edición por Covids0020; 28/08/2004 a las 16:12
  #2 (permalink)  
Antiguo 28/08/2004, 16:36
Avatar de Covids0020  
Fecha de Ingreso: septiembre-2003
Ubicación: España
Mensajes: 217
Antigüedad: 20 años, 6 meses
Puntos: 1
Sorry eh, vale, como decía ya tengo lo que quiero, pero solo me funciona dentro del bucle:
Código PHP:
      // Crearemos un array asociativo
      
$array_pais = array("$pais"=>
      array(
"ranking"=>"$ranking","oro"=>"$oro","plata"=>"$plata","bronce"=>"$bronce","total"=>"$total")
      );

      foreach (
$array_pais as $k=>$v)
      {
      echo 
"Pais <strong>$k</strong>: <br />";
        foreach (
$array_pais[$k] as $indice=>$valor)
        {
        echo 
"$indice: $valor<br />";
        }
      } 
Fuera del bucle (el bucle que recorria el archivo de origen), solo me coge el último array, en este caso $array_pais[Venezuela],
¿como lo soluciono???.

Es que no entiendo porqué no guarda las variables:
$array_pais[$pais]; y solo la de la última iteración del bucle.

En cada iteración del bucle se pierden??

Please.
__________________
"La sabiduría comienza donde acaba el conocimiento". Yaris.
http://www.culturadigital.org

Última edición por Covids0020; 28/08/2004 a las 16:41
  #3 (permalink)  
Antiguo 28/08/2004, 19:37
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
lo que pasa es que estás re-seteando el array $array_pais...
La idea es que toe siempre la posición siguiente:
No sé si me entiendes, te pongo un ejemplo:
Código PHP:
for($i=0;$i<10;$i++)
   
$mi_array = array($i=>"algo");

En este caso no ocurrirá lo que pretendemos... porque el array se está redefiniendo cada vez que pasamos. O sea, el array se define como un array de un sólo elemento. O sea, se va sobre-escribiendoY al final sólo contendrá el último elemento.

Lo ideal es poner:
Código PHP:
for($i=0;$i<10;$i++)
   
$mi_array[$i] = "algo";

De esta manera ya no redefinimos el array, sino que agregamos un elemento en cada pasada.

Saludos

Última edición por jpinedo; 28/08/2004 a las 19:38
  #4 (permalink)  
Antiguo 28/08/2004, 19:41
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
Por si no quedó claro, en lugar de poner:
Código PHP:
      $array_pais = array("$pais"=>
      array(
"ranking"=>"$ranking","oro"=>"$oro","plata"=>"$plata","bronce"=>"$bronce","total"=>"$total")
      ); 
pones:
Código PHP:
      $array_pais[$pais]["ranking"] = $ranking;
      
$array_pais[$pais]["oro"] = $oro;
      
$array_pais[$pais]["plata"] = $plata;
      
$array_pais[$pais]["bronce"] = $bronce;
      
$array_pais[$pais]["total"] = $total
Saludos
  #5 (permalink)  
Antiguo 28/08/2004, 23:48
Avatar de Covids0020  
Fecha de Ingreso: septiembre-2003
Ubicación: España
Mensajes: 217
Antigüedad: 20 años, 6 meses
Puntos: 1
Ummm , ¿no es lo mismo esto?:
Código PHP:
      $array_pais = array("$pais"=> 
      array(
"ranking"=>"$ranking","oro"=>"$oro","plata"=>"$plata","bronce"=>"$bronce","total"=>"$total"
      ); 
que esto?:
Código PHP:
$array_pais[$pais]["ranking"] = $ranking
      
$array_pais[$pais]["oro"] = $oro
      
$array_pais[$pais]["plata"] = $plata
      
$array_pais[$pais]["bronce"] = $bronce
      
$array_pais[$pais]["total"] = $total
Porque con el script último que puse, con este código:
Código PHP:
      $array_pais = array("$pais"=> 
      array(
"ranking"=>"$ranking","oro"=>"$oro","plata"=>"$plata","bronce"=>"$bronce","total"=>"$total"
      ); 
Obtengo el array $array_pais[pais_que_sea][dato_a_mostrar], que es lo mismo que se obtiene con el otro script, por ejemplo:

$array_pais[Italia][ranking]

Mi problema, es que fuera del bucle, solo se queda con la última iteración, entonces en cualquiera de los casos va a resetear el array, digo yo:

En la última iteración del bucle tanto:

$array_pais[$pais]

como

$array_pais = array("$pais"=> array());

se va a obtener el array:

$array_pais[$pais]

y este va a tomar el último pais de la lista ($pais), con lo que va a quedar como está:

$array_pais[Venezuela] no???, yo lo veo igual.

Bueno, probaré el código a ver.

Gracias de todas formas.
__________________
"La sabiduría comienza donde acaba el conocimiento". Yaris.
http://www.culturadigital.org
  #6 (permalink)  
Antiguo 29/08/2004, 00:06
Avatar de Covids0020  
Fecha de Ingreso: septiembre-2003
Ubicación: España
Mensajes: 217
Antigüedad: 20 años, 6 meses
Puntos: 1
Ah, vale, vale, creo que ya lo tuve algo así, como decía muy pegao en arrays, matrices, etc, como ponía en mi otro post pensé que era lo mismo.

Pero ahora, y creo que por eso cambie el script, tengo otro problemilla:

Si recorro el array con un foreach:
Código PHP:
    foreach ($array_pais as $k=>$v)
    {
    echo 
"Pais <strong>$k</strong>: <br />";
        foreach (
$array_pais[$k] as $indice=>$valor)
        {
        echo 
"$indice: $valor<br />";
        }
    } 
Si que me muestra todos los elementos, pero ... no me lee el array si pongo:
Código PHP:

echo "Italia: ".$array_pais[Italia]["total"];

// o

$pais_pasar "Italia";
echo 
"Italia: ".$array_pais[$pais_pasar]["total"]; 
bufff, caguen los arrays, si uno no sabe esto bien, pos ya me dirás que hacer con PHP y el acceso a datos externos .

Otra ayudilla please....
__________________
"La sabiduría comienza donde acaba el conocimiento". Yaris.
http://www.culturadigital.org

Última edición por Covids0020; 29/08/2004 a las 00:07
  #7 (permalink)  
Antiguo 29/08/2004, 01:34
Avatar de Covids0020  
Fecha de Ingreso: septiembre-2003
Ubicación: España
Mensajes: 217
Antigüedad: 20 años, 6 meses
Puntos: 1
Bufff, que trabajillo me ha costado :-p , pero aún no entiendo porqué no puedo usar directamente:

$array_pais[Estados Unidos]["dato"];

He de recorrer el array y buscar dentro de él:

Código PHP:
    <?php
    
foreach ($array_pais as $k=>$v)
    {
      if (
eregi("Estados Unidos",$k))
      {
      echo 
"Pais <strong>$k</strong>:<br />"
        foreach (
$array_pais[$k] as $indice=>$valor)
        {
        echo 
"$indice: $valor<br />";
        }
      }
    }
    
?>
Bueno, he de currarme esto más, por cierto, como podría usar array_keys() para encontrar la clave del pais que quiera??.

Gracias como siempre.
__________________
"La sabiduría comienza donde acaba el conocimiento". Yaris.
http://www.culturadigital.org
  #8 (permalink)  
Antiguo 29/08/2004, 19:37
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
Bueno... eso pasa porque estás generando claves que no son las que esperas... si haces un "ver>código fuente", verás que en lugar de decir:
Código:
<strong>Italia</strong>
Dice:
Código:
<strong>           &nbsp;Italia
</strong>
Si te das cuenta, todos los espacios que hay delante, el &nbsp; y el salto de línea al final.... todo eso forma parte del nombre. También pasa algo parecido en los otros atributos, aunque sólo con la cantidad de esapacios en blanco.

Esto lo puedes solucionar con la función trim()
http://www.php.net/manual/es/function.trim.php
que elimina los espacios en blanco al comienzo y al final.

Luego de pasarla por la función trim(), deberás quitar el "&nbsp;"... para eso lo reemplazas por una cadena vacía con la función str_replace()...

Por ejemplo sería así:
Código PHP:
$pais strip_tags($archivo[$i+2]).' '.strip_tags($archivo[$i+3]);//Hasta aquí hacías tú
//ahora deberás agregar:
$pais trim($pais);
$pais str_replace('&nbsp;','',$pais); 
Claro que puedes hacerlo en una sóla línea... pero así es más claro.
Con eso habrás "limpiado" los nombres de los países. Algo parecido deberás hacer para los números... pero sólo le quitas los espacios en blanco con trim().

Saludos
  #9 (permalink)  
Antiguo 29/08/2004, 19:47
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
Claro que para no repetir tanto, lo ideal sería hacer una función como esta:
Código PHP:
function limpiar($cadena){
    
$cadena strip_tags($cadena);
    
$cadena trim($cadena);
    
$cadena str_replace('&nbsp;','',$cadena);
    return 
$cadena;

Y así te ahorras todo el resto, simplemente a cada uno lo pasas por esa función:
Código PHP:
      $ranking limpiar($archivo[$i+1]);
      
$pais limpiar($archivo[$i+2]).' '.limpiar($archivo[$i+3]);
      
$orolimpiar($archivo[$i+4]);
      
$plata limpiar($archivo[$i+5]);
      
$bronce limpiar($archivo[$i+6]);
      
$total $oro+$plata+$bronce
Saludos
  #10 (permalink)  
Antiguo 30/08/2004, 00:31
Avatar de Covids0020  
Fecha de Ingreso: septiembre-2003
Ubicación: España
Mensajes: 217
Antigüedad: 20 años, 6 meses
Puntos: 1
Pos evidentemente, si que tengo una función así, para limpiar datos de entrada a DB, provenientes de forms, etc, de echo lo que aplico es un strip_tags para obtener los datos del código fuente del archivo origen, no sé porqué los sitios de este tipo no usan más los rss, no creí que la web de las olimpiadas no lo hiciera, bueno, no nos salgamos del tema, pero.... umm, si hago un foreach del array:
¿no me deberían salir los índices tal cual??, es decir:
si es $array_pais[ &nbsp;Italia] no me debería salir igual?, no con el espacio codificado claro, al imprimir los indices del array, ¿PHP o foreach limpia estos al imprimirlos?

Gracias de nuevo.
no sé, voy a probar a ver.
__________________
"La sabiduría comienza donde acaba el conocimiento". Yaris.
http://www.culturadigital.org
  #11 (permalink)  
Antiguo 30/08/2004, 00:44
Avatar de Covids0020  
Fecha de Ingreso: septiembre-2003
Ubicación: España
Mensajes: 217
Antigüedad: 20 años, 6 meses
Puntos: 1
Pos no, ya decía yo, aclarando una cosa, cuando generaba los ínidices, no se crea:
<strong> indice </strong> o con cualquier otro formato, eso era a la hora de imprimir los datos del array con ese bucle, desde el principio, sin hacer ese bucle, no puedo acceder a los índices del array directamente, estos índices ya van limpiados.

He mirado el código fuente que genera mi medallero muchas veces (para ver errores, etc) y los índices vienen sin formato, por ejemplo, Estados Unidos, Italia, China, Nueva Zelanda, en todo caso estará el espacio en paises de dos palabras, pero nada más.

Seguiré probando.
__________________
"La sabiduría comienza donde acaba el conocimiento". Yaris.
http://www.culturadigital.org
  #12 (permalink)  
Antiguo 30/08/2004, 00:51
Avatar de Covids0020  
Fecha de Ingreso: septiembre-2003
Ubicación: España
Mensajes: 217
Antigüedad: 20 años, 6 meses
Puntos: 1
Ainsssss, sorry, sorry, es que estos "parseos" los hago con otros archivos y en otras secciones y asumí que en este script también limpiaba los datos.... jiji , es verdad, aquí no los limpio, me acabo de dar cuenta... que fallo....

Pos gracias, que tontería y las vueltas que le ha dadooooo!!!!!!.
__________________
"La sabiduría comienza donde acaba el conocimiento". Yaris.
http://www.culturadigital.org
  #13 (permalink)  
Antiguo 30/08/2004, 14:54
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
Ok... también tienes que considerar que en tu caso "Japón" no será Japón" sino "Jap&oacute;n"... mira en la documentación de la función htmlentities()... creo que en los comentarios de los usuarios hay alguna función para hacer su inversa.

saludos
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 06:55.