Foros del Web » Programando para Internet » PHP »

Calcular valores más cercanos en array

Estas en el tema de Calcular valores más cercanos en array en el foro de PHP en Foros del Web. Umm... wenas. Veamos si me explico bien y no me lío mucho como siempre. Escribo aquí en PHP porque la aplicación es en PHP pero ...
  #1 (permalink)  
Antiguo 02/05/2009, 07:01
Avatar de Covids0020  
Fecha de Ingreso: septiembre-2003
Ubicación: España
Mensajes: 217
Antigüedad: 20 años, 6 meses
Puntos: 1
Calcular valores más cercanos en array

Umm... wenas. Veamos si me explico bien y no me lío mucho como siempre.
Escribo aquí en PHP porque la aplicación es en PHP pero es un problema genérico creo.

El contexto:
* Tengo un array con X puntos -items- de un mapa, pongamos 20.
* Los puntos tienen sus coordenadas, como es lógico, pero no tienen ordenación alguna, están a boleo :)
* Los puntos son puntos 2D, olvidarse del tema de proyecciones y demás.
Ejemplo del array:
Código PHP:
array
  
168 => 
    array
      
'coords' => 
        array
          
'x' => float 2132.816
          
'y' => float 1050.988
  177 
=> 
    array
      
'coords' => 
        array
          
'x' => float 2148.724
          
'y' => float 1400.774
  178 
=> 
    array
      
'coords' => 
        array
          
'x' => float 2143.421
          
'y' => float 1474.971
  187 
=> 
    array
      
'coords' => 
        array
          
'x' => float 2079.792
          
'y' => float 727.701 
* Tengo la función que me calcula la distancia (euclídea dicen ^^) mediante el teorema de Pitágoras.
Código PHP:
function distanceBetween($point1$point2) {
    return 
sqrt(
        
pow$point2['x'] - $point1['x'], ) + 
        
pow$point2['y'] - $point1['y'], )
    );

El problema:
Reordenar el array (u obtener otro, etc) de acuerdo a la cercanía entre los puntos.

Desarrollo
* Al principio hice ordenaciones de todo tipo sobre los arrays originales y claves en el eje Y o X, pero es obvio que los puntos pueden estar a un lado u otro del eje, calculando las coordenadas geométricas o los metros reales...

* La solución obvia que veo es que tengo que comparar cada item con el resto, obtener el más cercano y guardar otro o reordenar este en base a esto.
Bien, esto no caigo ahora mismo como hacerlo en PHP: No sé si con aplicar una función de usuario al array... recorrerlo e ir haciendo cálculos. Esto último será muy pesado para el sistema actual, ya es un array anidado :(
Pienso en ir guardando los resultados positivos en otro array con el índice de proximidad y luego usarlo para ordenarlos..., o algo así.

Un problema grave que veo es que puede ser una operación muy pesada incluso con pocos puntos. Así que a lo mejor el diseño de la solución es otro y no montar ese array.

...bueno, sigo pensando, que veo que escribir ayuda a verlo más claro además :D
Pero la cuestión es que cualquier aporte puede hacerme ver la solución que quizá sea muy tonta y muy clara pero que no acierto a ver del todo.

---
Esto ya son EXTRAS:

Resultado buscado:
Es para un mapa SVG: Tengo que construir una línea que una los puntos del mapa pero en el array están desordenados.
La línea lo mismo sería continua que saltaría entre puntos alejados.

Desde ya: muchas gracias! ;)
__________________
"La sabiduría comienza donde acaba el conocimiento". Yaris.
http://www.culturadigital.org

Última edición por Covids0020; 02/05/2009 a las 07:09
  #2 (permalink)  
Antiguo 02/05/2009, 07:35
 
Fecha de Ingreso: abril-2008
Mensajes: 435
Antigüedad: 16 años
Puntos: 10
Respuesta: Calcular valores más cercanos en array

puedes ver esto
http://ar2.php.net/manual/es/functio...-recursive.php
o esto
http://ar2.php.net/manual/es/function.array-walk.php

igual tambien te dejo todas las funciones
http://ar2.php.net/manual/es/ref.array.php

no creo que sea muy dificil pero si es un lio porque te quedo una matriz un poco grande, yo personalmente si es posible intentaria reducir a dos array en lugar de tres eso te evitaria un poco el dolor de cabeza

saludos
  #3 (permalink)  
Antiguo 02/05/2009, 07:42
Avatar de Covids0020  
Fecha de Ingreso: septiembre-2003
Ubicación: España
Mensajes: 217
Antigüedad: 20 años, 6 meses
Puntos: 1
Respuesta: Calcular valores más cercanos en array

Gracias tío, si ya conozco array_walk(), array_map()... y todo el rollo.
El problema es... bfff, me cuesta explicarlo y todo gg, la forma de hacerlo. Es decir... supongo que será la implementación. Por supuesto que no busco que me hagan el código eh? ;)

Ummm... ah vale, sobre el tema de 3 anidados no importa porque no se llega al tercer nivel. Lo he puesto para ilustrar pero la función de distancia recibe dos arrays. O sea hasta coords. Y los índices los necesito claro.

Antes he dicho que conocía las funciones de array... pero es que hay tantas y como hay que usar varias de ellas, ufff, que no lo veo.

...sigo en ello.
__________________
"La sabiduría comienza donde acaba el conocimiento". Yaris.
http://www.culturadigital.org
  #4 (permalink)  
Antiguo 02/05/2009, 07:46
 
Fecha de Ingreso: abril-2008
Mensajes: 435
Antigüedad: 16 años
Puntos: 10
Respuesta: Calcular valores más cercanos en array

o sea basicamente la idea es aplicar la funcion distancebetween() a las coordenadas no? y despues con el resultado hay que hacer algo especifico?

basicamente la idea seria empezar a recorrer los array con foreach y cuando llegues a las coordenadas aplicarle tu funcion con array_walk
  #5 (permalink)  
Antiguo 02/05/2009, 08:08
Avatar de Covids0020  
Fecha de Ingreso: septiembre-2003
Ubicación: España
Mensajes: 217
Antigüedad: 20 años, 6 meses
Puntos: 1
Respuesta: Calcular valores más cercanos en array

Umm... básicamente es obtener el mismo array pero ordenado de acuerdo a la distancia...
Joder, ahora he perdido yo el foco xD, ¿a la distancia de de qué?...

A ver, a ver si me aclaro, umm... imagino que debo coger un punto -item- como referencia, el primero o el último sé que valen. Y luego ordenarlos respecto a la distancia con el mismo. Yastá, eso es ggg, ahora voy a ver si saco algo y si me aclaro porque me he vuelto a liar :P

Gracias de todas formas.
__________________
"La sabiduría comienza donde acaba el conocimiento". Yaris.
http://www.culturadigital.org
  #6 (permalink)  
Antiguo 02/05/2009, 08:19
 
Fecha de Ingreso: abril-2008
Mensajes: 435
Antigüedad: 16 años
Puntos: 10
Respuesta: Calcular valores más cercanos en array

ok, pero lo que quieres ordenar es el primer numero? el del primer array porque ese no entiendo para que sirve
  #7 (permalink)  
Antiguo 02/05/2009, 08:37
Avatar de Covids0020  
Fecha de Ingreso: septiembre-2003
Ubicación: España
Mensajes: 217
Antigüedad: 20 años, 6 meses
Puntos: 1
Respuesta: Calcular valores más cercanos en array

No no, ggg, eso solo es el índice de items.
La cuestión es que no es una ordenación por ningún valor de la matriz, que es lo que estaba diciendo, sino a través de los resultados que arroje la función de la distancia.

Es decir, debo ordenar esos items de acuerdo a la cercanía entre ellos. La cercanía entre ellos la determina la función differenceBetwen().
Por eso pensé en montar un nuevo array, porque en ese mismo no veo la manera.

Buff, lo dicho, un follón, creo.
__________________
"La sabiduría comienza donde acaba el conocimiento". Yaris.
http://www.culturadigital.org
  #8 (permalink)  
Antiguo 02/05/2009, 08:46
 
Fecha de Ingreso: abril-2008
Mensajes: 435
Antigüedad: 16 años
Puntos: 10
Respuesta: Calcular valores más cercanos en array

bien entonces yo primero haria un array mas facil sacaria los valores innecesarios, y si los resultados es mejor que esten en otro array

yo diria algo asi, para hacerlo mas facil

Código PHP:
array
  
168 => 
      array
         
'x' => float 2132.816
         
'y' => float 1050.988
  177 
=> 
      array
        
'x' => float 2148.724
        
'y' => float 1400.774
  178 
=> 
      array
        
'x' => float 2143.421
        
'y' => float 1474.971
  187 
=> 
      array
        
'x' => float 2079.792
        
'y' => float 727.701 
incluso podriamos sacar el indice tambien
  #9 (permalink)  
Antiguo 02/05/2009, 08:52
Avatar de Covids0020  
Fecha de Ingreso: septiembre-2003
Ubicación: España
Mensajes: 217
Antigüedad: 20 años, 6 meses
Puntos: 1
Respuesta: Calcular valores más cercanos en array

Bueno... un intento pero vamos, ni de coña, creo. A ver si así se ilustra mejor lo que me gustaría sacar:
Código PHP:
Ver original
  1. foreach ( $myArray as $item ) {
  2.     $myFilterArray[] = array_filter(
  3.         $myArray,
  4.         "differenceBetween($item['location'], /* No sé... ¿next($myArray)? */)"
  5.     );
  6. }

Y supongo que debería hacer esto una función recursiva a su vez :S
__________________
"La sabiduría comienza donde acaba el conocimiento". Yaris.
http://www.culturadigital.org
  #10 (permalink)  
Antiguo 02/05/2009, 08:57
Avatar de Covids0020  
Fecha de Ingreso: septiembre-2003
Ubicación: España
Mensajes: 217
Antigüedad: 20 años, 6 meses
Puntos: 1
Respuesta: Calcular valores más cercanos en array

Cita:
Iniciado por Adell Ver Mensaje
bien entonces yo primero haria un array mas facil sacaria los valores innecesarios, y si los resultados es mejor que esten en otro array

yo diria algo asi, para hacerlo mas facil

Código PHP:
array
  
168 => 
      array
         
'x' => float 2132.816
         
'y' => float 1050.988
  177 
=> 
      array
        
'x' => float 2148.724
        
'y' => float 1400.774
  178 
=> 
      array
        
'x' => float 2143.421
        
'y' => float 1474.971
  187 
=> 
      array
        
'x' => float 2079.792
        
'y' => float 727.701 
incluso podriamos sacar el indice tambien
Ggg, perdona que me ría pero no es en mal rollo, te agradezco el interés ;) Es que me hace gracia eso.
Mira, olvida el tema del array inicial, que no es problema porque para el caso, hay que verlo así:

Código PHP:
array
168 => 'coords'
177 => 'coords'
... 
Es decir, solo es un índice y un valor que siplemente es otro array pero como si fuera cualquier otra cosa: objeto, string, numérico... Eso da igual, no vamos a pasar de ese nivel:
La función de usuario se aplica al primer valor, fíjate en el código anterior que he puesto ;)
Míralo así:
Código PHP:
Ver original
  1. foreach ( $myArray as $item ) {
  2.     // Solo vamos a usar el primer nivel y su valor: $item['location'], nada más ;)
  3.     var_dump($item['location']);    // Solo es de ejemplo
  4. }
__________________
"La sabiduría comienza donde acaba el conocimiento". Yaris.
http://www.culturadigital.org
  #11 (permalink)  
Antiguo 02/05/2009, 09:04
 
Fecha de Ingreso: abril-2008
Mensajes: 435
Antigüedad: 16 años
Puntos: 10
Respuesta: Calcular valores más cercanos en array

primero lo que hay que hacer es llegar hasta las coordenadas pensa que estas trabajando sobre una matriz, para eso hay que hacer dos foreach, perdon que no te puedar dar un mejor ejemplo es que me tengo que ir y ando corto de tiempo pero si para cuando vuelva no lo resolviste ya te doy una solucion concreta

saludos
  #12 (permalink)  
Antiguo 02/05/2009, 09:36
Avatar de Covids0020  
Fecha de Ingreso: septiembre-2003
Ubicación: España
Mensajes: 217
Antigüedad: 20 años, 6 meses
Puntos: 1
Respuesta: Calcular valores más cercanos en array

Nada, ya lo tengo... el caso es que imaginaba que había algún método de obviar el doble bucle ya que puede ser una array muy pesado. El tema de las coordenadas es lo de menos, como decía la función trabaja con ese valor y debe ser un array. De ese nivel no se pasa.

Pongo el código original -por si alguien ha seguido este despropósito mío :(- a falta de extraer ya lo que quiero. ...con lo fáciles que son a veces las cosas y qué difíciles se empeña uno en hacerlas :(

Código PHP:
Ver original
  1. foreach ( $cpsEnemies['allieds'] as $item ) {
  2.     foreach ( $cpsEnemies['allieds'] as $item2 ) {
  3.         $distance = $wwiiol->distanceBetween($item['coords'], $item2['coords']);
  4.         if ( $distance > 0 )
  5.             $distances[$item['name']][$item2['name']] = $distance;
  6.     }
  7.     asort($distances[$item['name']]);
  8. }
Donde $cpsEnemies['allieds'] era mi array original que puse y el item coords las coordenadas location.

Así tengo un array asociativo de distancias de todos los items respectivamente a cada uno de ellos. Se omite la coparación propia y se ordena de menor a mayor al final del segundo bucle.

Esto me da un array con los nombres de las ubicaciones con otro nivel con los nombres del resto de ubicaciones y la distancia a las mismas. Y ya se puede sacar el item más cercano, tanto ordenando (1er subitem) como sin ordenar.
Código PHP:
array
  
'Marche' => 
    array
      
'Rochefort' => float 42.7442310727
      
'Ciney' => float 80.7580532021
      
'Wellin' => float 86.9506102796
      
'Libin' => float 99.0115294297
      
'Gedinne' => float 159.044804684
      
'Namur' => float 176.47504293
      
'Hannut' => float 199.166194847
      
'Eghezee' => float 202.551874175
...
  
'Damvillers' => 
    array
      
'Verdun' => float 74.3862663265
      
'Stenay' => float 86.2978395384
      
'Buzancy' => float 146.65572847
      
'LeChesne' => float 212.947478607
      
'Libin' => float 257.902556211
... 
---
Muchas gracias Adell, en serio ;)
A veces, no es que salga o deje de salir la solución, pero pensarlo y hablarlo con alguien hace que salgan las ideas. Es justamente lo que buscaba. Lo dicho, un saludo ;)
__________________
"La sabiduría comienza donde acaba el conocimiento". Yaris.
http://www.culturadigital.org

Última edición por Covids0020; 02/05/2009 a las 09:49
  #13 (permalink)  
Antiguo 02/05/2009, 16:12
 
Fecha de Ingreso: abril-2008
Mensajes: 435
Antigüedad: 16 años
Puntos: 10
Respuesta: Calcular valores más cercanos en array

no hay porque agradecer, y si intentar explicar a alguien lo que queremos hacer siempre soluciona las cosas

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 00:54.