Autor Tema: Crear arrays dinámicos (arreglos) o colecciones con número variable de datos PHP  (Leído 11515 veces)

5378453

  • Principiante
  • **
  • Mensajes: 56
    • Ver Perfil
    • Mugiwara no Fansub
Tengo estos datos en un array:

Código: [Seleccionar]
array (size=10)
  0 =>
    array (size=1)
      0 => string '5401842' (length=7)
  1 =>
    array (size=1)
      0 => string '5401858' (length=7)
  2 =>
    array (size=1)
      0 => string '5401862' (length=7)
  3 =>
    array (size=1)
      0 => string '5401864' (length=7)
  4 =>
    array (size=1)
      0 => string '5401867' (length=7)
  5 =>
    array (size=1)
      0 => string '5401869' (length=7)
  6 =>
    array (size=1)
      0 => string '5401871' (length=7)
  7 =>
    array (size=1)
      0 => string '5401879' (length=7)
  8 =>
    array (size=1)
      0 => string '5401883' (length=7)
  9 =>
    array (size=1)
      0 => string '5401889' (length=7)

Quiero compararlo con otros datos que tengo, si el numero es mayor que el primero pero menor que el segundo, que lo agregue al primer valor, asi como si fuera su hijo, lo que quiero saber es como hacer para agregarlo con que funcion, lo otro es por medio de un ciclo for
« Última modificación: 11 de Agosto 2015, 09:56 por César Krall »

Mastermind

  • Experto
  • *****
  • Mensajes: 536
    • Ver Perfil
Re:Como anidar un dato en cierta parte de un Array
« Respuesta #1 en: 05 de Agosto 2015, 19:02 »
¿Puedes poner un ejemplo de lo que quieres hacer?

Saludos!

5378453

  • Principiante
  • **
  • Mensajes: 56
    • Ver Perfil
    • Mugiwara no Fansub
Re:Como anidar un dato en cierta parte de un Array
« Respuesta #2 en: 05 de Agosto 2015, 19:29 »
¿Puedes poner un ejemplo de lo que quieres hacer?

Saludos!

Estoy haciendo web scrapping, quiero acomodar las secciones y publicaciones, cada seccion tiene su codigo, y casa seccion le corresponde un numeor mayor que el codigo pero menor que la seccion siguiente

Citar
<?php

   $html = file_get_contents("http://dof.gob.mx/index.php?year=2015&month=07&day=27");
   file_put_contents('dof.html',$html);
   
   $xml = new DomDocument();
   
   @$xml->loadHTML($html);
   $xml->normalizeDocument();
   $xpath = new DOMXPath($xml);
   
   /////////////////SECCIONES/////////////////////////
   
   $titulos = $xpath->query('//td[@class="subtitle_azul"]');
   
   // $titulo= new ArrayObject();
   // $codigo = new ArrayObject();
   
   foreach($titulos as $item){
      // print_r($item);
      $titulo[] = array(trim($item->textContent));
      foreach(($item->getElementsByTagName("a")) as $new){
         $atributo= $new->getAttribute("href");
         // print_r($atributo);
         $arr = explode("=", $atributo);
         $codigo[] = array($arr[1]);
         // echo $arr[1];
      }
      
   }
   
   $secciones = new ArrayObject();
   
   // for($i = 0;$i < count($titulo); $i ++){
      // $test -> append(array($codigo[$i] => $titulo[$i]));
   // }
   
   // var_dump($test);
   // var_dump($titulo);
   // var_dump($codigo);
   
   // var_dump($codigo[0]);
   // var_dump($codigo[1]);
   
   // if($codigo[0] < $codigo[1]){
      // var_dump($codigo[0]);
   // }
   // else{
      // var_dump($codigo[1]);
   // }
   
   ////////////////PUBLICACIONES/////////////////
   
   // $titulo2= new ArrayObject();
   // $codigo2= new ArrayObject();
   
   $enlaces = $xpath -> query('//a[@class="enlaces"]');
   // print_r($enlaces);
   foreach($enlaces as $item){
      $test = $item -> getAttribute("href");
      $test2= str_replace('&' , '=',$test);
      $explo = explode("=", $test2);
      // @$codigo2 -> append($explo[1]);
      @$codigo2[] = array($explo[1]);
      
      // $titulo2 -> append(trim($item -> textContent));
      $titulo2[] = array(trim($item -> textContent));
   }
   
   // var_dump($titulo2);
   // var_dump($codigo2);
   
   $publicaciones = new ArrayObject();
   
   // for($i = 0;$i < count($titulo2); $i ++){
      // @$publicaciones -> append(array($codigo2[$i] => $titulo2[$i]));
      // $publicaciones[] = array($codigo2[$i])
   // }
   
   // var_dump($publicaciones);

   for($i = 0; $i < count($codigo); $i ++){
      for($x = 0; $x < count($codigo2); $x ++){
         if($codigo2[$x] > $codigo[$i] && $codigo2[$x] < $codigo[$i + 1]){
            array_push($codigo[$i],$codigo2[$x]);
            // $codigo[$i] = array($codigo2[$x]);
         }
      }
   }
   @var_dump($codigo);
   
   // var_dump($codigo);
   
   
?>

Mastermind

  • Experto
  • *****
  • Mensajes: 536
    • Ver Perfil
Re:Como anidar un dato en cierta parte de un Array
« Respuesta #3 en: 05 de Agosto 2015, 19:54 »
Hola me refería a esto

Citar
Quiero compararlo con otros datos que tengo, si el numero es mayor que el primero pero menor que el segundo, que lo agregue al primer valor, asi como si fuera su hijo, lo que quiero saber es como hacer para agregarlo

Por ejemplo tienes el array con los diez números y ahora tienes otro número nuevo como 5401863 ¿qué es lo que quieres hacer con el array? ¿agrandarlo para añadir el número nuevo de forma que quede ordenado?

5378453

  • Principiante
  • **
  • Mensajes: 56
    • Ver Perfil
    • Mugiwara no Fansub
Re:Como anidar un dato en cierta parte de un Array
« Respuesta #4 en: 05 de Agosto 2015, 20:07 »
Hola me refería a esto

Citar
Quiero compararlo con otros datos que tengo, si el numero es mayor que el primero pero menor que el segundo, que lo agregue al primer valor, asi como si fuera su hijo, lo que quiero saber es como hacer para agregarlo

Por ejemplo tienes el array con los diez números y ahora tienes otro número nuevo como 5401863 ¿qué es lo que quieres hacer con el array? ¿agrandarlo para añadir el número nuevo de forma que quede ordenado?

Estos son los codigos de las secciones:
Código: [Seleccionar]
array (size=10)
  0 =>
    array (size=1)
      0 => string '5401842' (length=7)
  1 =>
    array (size=1)
      0 => string '5401858' (length=7)
  2 =>
    array (size=1)
      0 => string '5401862' (length=7)
  3 =>
    array (size=1)
      0 => string '5401864' (length=7)
  4 =>
    array (size=1)
      0 => string '5401867' (length=7)
  5 =>
    array (size=1)
      0 => string '5401869' (length=7)
  6 =>
    array (size=1)
      0 => string '5401871' (length=7)
  7 =>
    array (size=1)
      0 => string '5401879' (length=7)
  8 =>
    array (size=1)
      0 => string '5401883' (length=7)
  9 =>
    array (size=1)
      0 => string '5401889' (length=7)

Estos son los codigos de las publicaciones:
Código: [Seleccionar]
array (size=40)
  0 =>
    array (size=1)
      0 => string '5401843' (length=7)
  1 =>
    array (size=1)
      0 => string '5401844' (length=7)
  2 =>
    array (size=1)
      0 => string '5401845' (length=7)
  3 =>
    array (size=1)
      0 => string '5401846' (length=7)
  4 =>
    array (size=1)
      0 => string '5401847' (length=7)
  5 =>
    array (size=1)
      0 => string '5401848' (length=7)
  6 =>
    array (size=1)
      0 => string '5401849' (length=7)
  7 =>
    array (size=1)
      0 => string '5401850' (length=7)
  8 =>
    array (size=1)
      0 => string '5401851' (length=7)
  9 =>
    array (size=1)
      0 => string '5401852' (length=7)
  10 =>
    array (size=1)
      0 => string '5401853' (length=7)
  11 =>
    array (size=1)
      0 => string '5401854' (length=7)
  12 =>
    array (size=1)
      0 => string '5401855' (length=7)
  13 =>
    array (size=1)
      0 => string '5401856' (length=7)
  14 =>
    array (size=1)
      0 => string '5401857' (length=7)
  15 =>
    array (size=1)
      0 => string '5401859' (length=7)
  16 =>
    array (size=1)
      0 => string '5401860' (length=7)
  17 =>
    array (size=1)
      0 => string '5401861' (length=7)
  18 =>
    array (size=1)
      0 => string '5401863' (length=7)
  19 =>
    array (size=1)
      0 => string '5401865' (length=7)
  20 =>
    array (size=1)
      0 => string '5401866' (length=7)
  21 =>
    array (size=1)
      0 => string '5401868' (length=7)
  22 =>
    array (size=1)
      0 => string '5401870' (length=7)
  23 =>
    array (size=1)
      0 => string '5401872' (length=7)
  24 =>
    array (size=1)
      0 => string '5401873' (length=7)
  25 =>
    array (size=1)
      0 => string '5401874' (length=7)
  26 =>
    array (size=1)
      0 => string '5401875' (length=7)
  27 =>
    array (size=1)
      0 => string '5401876' (length=7)
  28 =>
    array (size=1)
      0 => string '5401877' (length=7)
  29 =>
    array (size=1)
      0 => string '5401878' (length=7)
  30 =>
    array (size=1)
      0 => string '5401880' (length=7)
  31 =>
    array (size=1)
      0 => string '5401881' (length=7)
  32 =>
    array (size=1)
      0 => string '5401882' (length=7)
  33 =>
    array (size=1)
      0 => string '5401884' (length=7)
  34 =>
    array (size=1)
      0 => string '5401885' (length=7)
  35 =>
    array (size=1)
      0 => string '5401886' (length=7)
  36 =>
    array (size=1)
      0 => string '5401887' (length=7)
  37 =>
    array (size=1)
      0 => string '5401888' (length=7)
  38 =>
    array (size=1)
      0 => string '5401890' (length=7)
  39 =>
    array (size=1)
      0 => null

Lo que quiero hacer es que cada codigo de las publicaciones se compare con cada codigo de las secciones, si el codigo de la publicacion es mayor que el codigo de la seccion 1 pero menor que el de la seccion 2, que sea parte del codigo 1 y asi sucesivamente, algo asi:

Seccion 1:
    Publicacion 1
    Publicacion 2

Seccion 2:
    Publicacion 3
    Publicacion 4
    Publicacion 5

Seccion 3:
    Publicacion 6
« Última modificación: 05 de Agosto 2015, 20:14 por 5378453 »

Mastermind

  • Experto
  • *****
  • Mensajes: 536
    • Ver Perfil
Re:Como anidar un dato en cierta parte de un Array
« Respuesta #5 en: 05 de Agosto 2015, 23:33 »
Hola ahora creo que he entendido

En php hay varias formas de crear arrays

Inicializar varios elementos:

Código: [Seleccionar]
$colorList = array("red","green","blue","black","white");
Inicializar de uno en uno:

Código: [Seleccionar]
$colorList[0] = "red";
$colorList[1] = "green";
$colorList[2] = "blue";
$colorList[3] = "black";
$colorList[4] = "white";


O dejar que php asigne la numeración automáticamente:

Código: [Seleccionar]
$colorList[] = "red";
$colorList[] = "green";
$colorList[] = "blue";
$colorList[] = "black";
$colorList[] = "white";


En este caso creo que podrías crear las variables de secciones por ejemplo

seccion[0] = 45676

seccion[1] = 67421

Si ahora tienes una publicación con númeroPublicacion 47877 comprobar
Código: [Seleccionar]
desde i = 0 hasta numeroSecciones
Si numeroPublicacion > seccion[i] y numeroPublicacion < seccion[i+1] Entonces
seccion[i][] = numeroPublicacion
FinSi
FinDesde

De esta manera añadirías la publicación dentro de la sección dejando que sea php quien automáticamente vaya determinando el índice que toca de modo que por ejemplo

seccion[3][6] = 59734 significaría que dentro de la sección con índice 3, la publicación con índice 6 es la 59734

No sé si servirá  ::)

5378453

  • Principiante
  • **
  • Mensajes: 56
    • Ver Perfil
    • Mugiwara no Fansub
Re:Como anidar un dato en cierta parte de un Array
« Respuesta #6 en: 06 de Agosto 2015, 17:22 »
Asi estaba el codigo del ciclo antes:

Código: [Seleccionar]
for($i = 0; $i < count($codigo); $i ++){
      for($x = 0; $x < count($codigo2); $x ++){
         if($codigo2[$x] > $codigo[$i] && $codigo2[$x] < $codigo[$i + 1]){
            array_push($codigo[$i],$codigo2[$x]);
         }
      }
   }


Este es como quedo con tu ayuda:

Código: [Seleccionar]
for($i = 0; $i < count($codigo); $i ++){
for($x = 0; $x < count($codigo2); $x ++){
if($codigo2[$x] > $codigo[$i] and $codigo2[$x] < $codigo[$i + 1]){
$codigo[$i][] = $codigo2[$x];
}
}
}

El problema es que sigue haciendo lo mismo, si agrega el codigo de la publicacion pero solo el primero que sigue despues de cada seccion, los demas no los agrega. Segun yo tengo el ciclo for bien, la verdad no se que sea
« Última modificación: 07 de Agosto 2015, 15:36 por César Krall »

SamML

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 18
    • Ver Perfil
Re:Como anidar un dato en cierta parte de un Array
« Respuesta #7 en: 07 de Agosto 2015, 13:49 »
Hola, no tengo claro de que pueda ser el error y no puedo verlo con detenimiento o probarlo (ando con prisas en este momento).
Pero me parece ver, a bote pronto, que cuando declaras el array indicas (size = 1) para los "subelementos" quizá este ahí el problema, no se si es lo que buscabas.
A mi entender el algoritmo para el push parece ser el correcto.

Un saludo.
« Última modificación: 07 de Agosto 2015, 13:52 por SamML »

5378453

  • Principiante
  • **
  • Mensajes: 56
    • Ver Perfil
    • Mugiwara no Fansub
Re:Como anidar un dato en cierta parte de un Array
« Respuesta #8 en: 08 de Agosto 2015, 17:02 »
Hola, no tengo claro de que pueda ser el error y no puedo verlo con detenimiento o probarlo (ando con prisas en este momento).
Pero me parece ver, a bote pronto, que cuando declaras el array indicas (size = 1) para los "subelementos" quizá este ahí el problema, no se si es lo que buscabas.
A mi entender el algoritmo para el push parece ser el correcto.

Un saludo.

Como podria declarar el array para que acepte mas de 1?

SamML

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 18
    • Ver Perfil
Re:Como anidar un dato en cierta parte de un Array
« Respuesta #9 en: 08 de Agosto 2015, 20:30 »
Como podria declarar el array para que acepte mas de 1?

Declarar arrays multidimensionales consiste en "meter un array dentro de otro array", a modo general.  Es decir, cada posición de un array correspondería a otro array y por eso para referirse a un elemento concreto habría tantos indices como arrays anidados.

Existen diferentes maneras de hacerlo como te indica mastermind, hay muchas formas de declarar un array. Puedes declarar un array vacio, es decir puedes inicializarlo o no.

Código: [Seleccionar]
$mi_array_vacio = array();
$mi_array = array (dato1,dato2,dato3...);

Cuando usas arrays multidimensionales normalmente se hace uso del método de asociación o asociativo para declararlos, ya que suelen ser casos en los que vas a querer referirte a "sub-arrays" concretos y es digamos una buena manera de saber a que te estas refiriendo en vez de usar indices numéricos. Me explico.
El método asociativo consiste en usar como indices palabras o algo que asocie a ese indice lo que contiene. Es la forma mas "legible" digamos de utilizarlos. Por ejemplo para un array unidimensional:
Código: [Seleccionar]

<?php
$datos 
= array(
    
'edad' => 25,
    
'nombre' => 'Samuel',
    
'ID' => 4536323,
);
var_dump($datos);
echo 
"<hr>";
?>


Si lo que quieres es simplemente un array multidimensional:
Código: [Seleccionar]
$array_1 = array();
$array_2 = array();
$mi_array_de_arrays = array($array_1, $array_2);
o
Código: [Seleccionar]
$mi_array_de_arrays = array(array(), array());

Y te referiras a los elementos como:

Código: [Seleccionar]
$mi_array_de_arrays [a][b]donde a y b son los indices de cada array que tu quieras. Por ejemplo
Código: [Seleccionar]
<?php
$array_1 
= array(1,2,3);
$array_2 = array(4,5,6);
$mi_array_de_arrays = array($array_1$array_2);

echo  
$mi_array_de_arrays [0,0] . "hace referencia al 1";
?>


Por ultimo te dejo un codigo de cómo poder usar ambos conceptos para crear arrays multidimensionales de modo asociativo así como el uso de la función count(); para luego poder recorrer arrays de los que desconoces el tamaño.  Puedes hacer copia y pega de este codigo y observas su funcionamiento.

Código: [Seleccionar]
<?php

$talla 
= array ("S","M","L","XL");
$color = array ("azul","rojo","verde","blanco","negro");
$camiseta = array();

$camiseta = array (
'talla' => $talla,
'color' => $color,
);
   

var_dump($camiseta);
echo 
'count($talla) result = ' count($talla) . '<br />';
echo 
'count($color) result = ' count($color) . '<br />';
echo 
'count($camiseta) result = ' count($camiseta);

echo 
"<hr>";
?>

En referencia a tu código si almacenas un único tipo de dato y lo que quieres es realizar la ordenación de un array existen funciones para ello.
Como dato, de forma interna los algoritmos de ordenación son un tema muy interesante en cuanto a los recursos que utilizan ya que a simple vista parece "una chorrada" pero cuando profundizas no lo es para nada y por ello han ido surgiendo métodos que recurren a las matemáticas y la recursividad y resuelven este tipo de algoritmos. El mas simple es comparar cada valor con el resto e ir intercambiando uno con otro en función de si es mayor o menor.  Este método en comparación a otros es costoso en recursos y reiteraciones.

No obstante lo que te interesa, si lo que necesitas es ordenar una tabla, es conocer funciones tipo asort(); o arsort(); que ordenan valores númericos por ejemplo de menor a mayor y de mayor a menor respectivamente. O funciones tipo array_multisort(); ksort(); krsort(); que tienen en cuenta si utilizas el método asociativo.

Hay cantidad de funciones para ordenar y unas van bien para unos casos y otras para otros, puedes visitar: http://php.net/manual/es/array.sorting.php

Saludos

Mastermind

  • Experto
  • *****
  • Mensajes: 536
    • Ver Perfil
Re:crear arrays dinámicos o con número variable de datos en PHP
« Respuesta #10 en: 09 de Agosto 2015, 20:50 »
He estado haciendo algunas pruebas rudimentarias y esto es lo que llevo por el momento. Creo que los resultados que muestra por pantalla son correctos al menos la indicación que respecto a dónde debería realizarse la inserción de cada dato:

Código: [Seleccionar]
<?php
echo '<meta charset="utf-8"/>';

function 
insertarPublicacion ($numeroPublicacion$seccion) {
echo '<br/>Recibida '.$numeroPublicacion' como numero de publicacion ';
$insercionRealizada false;
$i=0;
while ($i<count($seccion) && $insercionRealizada == false)  {
if ($i+!= count($seccion) && $numeroPublicacion $seccion[$i] && $numeroPublicacion $seccion[$i+1]){
echo 'Se debe insertar la publicacion '.$numeroPublicacion' en la seccion '.$seccion[$i].'<br/>';

$insercionRealizada true;
} else if ($i+1==count($seccion) && $numeroPublicacion>$seccion[$i])
{
echo 'Ultima - Se debe insertar la publicacion '.$numeroPublicacion' en la seccion '.$seccion[$i].'<br/>';
$insercionRealizada true;
}

$i++;
}

if (
$insercionRealizada == false) {echo 'Para la publicacion indicada no ha sido posible encontrar punto de inserción<br/>';}

}

echo 
'COMIENZO DEL TEST';

$seccion[]= 5401842;
$seccion[]= 5401858;
$seccion[]= 5401862;
$seccion[] = 5401864;
$seccion[] = 5401867;
$seccion[] = 5401869;
$seccion[] = 5401871;
$seccion[] = 5401879;
$seccion[] = 5401883;
$seccion[] = 5401889;


echo 
'<br/>';
var_dump($seccion);
echo 
'<br/>';

$publicacion[] =5401843$publicacion[] =5401844$publicacion[] =5401845;
$publicacion[] =5401846$publicacion[] =5401847$publicacion[] =5401848;
$publicacion[] =5401849$publicacion[] =5401850$publicacion[] =5401851;
$publicacion[] =5401852$publicacion[] =5401853$publicacion[] =5401854;
$publicacion[] =5401855$publicacion[] =5401856$publicacion[] =5401857;
$publicacion[] =5401859$publicacion[] =5401860$publicacion[] =5401861;
$publicacion[] =5401863$publicacion[] =5401865$publicacion[] =5401866;
$publicacion[] =5401868$publicacion[] =5401870$publicacion[] =5401872;
$publicacion[] =5401873$publicacion[] =5401874$publicacion[] =5401875;
$publicacion[] =5401876$publicacion[] =5401877$publicacion[] =5401878;
$publicacion[] =5401880$publicacion[] =5401881$publicacion[] =5401882;
$publicacion[] =5401884$publicacion[] =5401885$publicacion[] =5401886;
$publicacion[] =5401887$publicacion[] =5401888$publicacion[] =5401890;

 for(
$i=0;$i<count($publicacion);$i++) {
insertarPublicacion($publicacion[$i], $seccion);
}

echo 
'FIN DEL TEST.';

?>

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".