Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: 5378453 en 05 de Agosto 2015, 18:45
-
Tengo estos datos en un array:
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
-
¿Puedes poner un ejemplo de lo que quieres hacer?
Saludos!
-
¿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
<?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);
?>
-
Hola me refería a esto
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?
-
Hola me refería a esto
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:
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:
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
-
Hola ahora creo que he entendido
En php hay varias formas de crear arrays
Inicializar varios elementos:
$colorList = array("red","green","blue","black","white");
Inicializar de uno en uno:
$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:
$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
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á ::)
-
Asi estaba el codigo del ciclo antes:
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:
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
-
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.
-
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?
-
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.
$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:
<?php
$datos = array(
'edad' => 25,
'nombre' => 'Samuel',
'ID' => 4536323,
);
var_dump($datos);
echo "<hr>";
?>
Si lo que quieres es simplemente un array multidimensional:
$array_1 = array();
$array_2 = array();
$mi_array_de_arrays = array($array_1, $array_2);
o
$mi_array_de_arrays = array(array(), array());
Y te referiras a los elementos como:
$mi_array_de_arrays [a][b]
donde a y b son los indices de cada array que tu quieras. Por ejemplo
<?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.
<?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
-
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:
<?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+1 != 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.';
?>