2010-03-19 5 views
2

J'essaye de produire des résultats de 2 requêtes sql à un fichier JSON. Le problème est que je voudrais les ordonner ascendants par distance qui est le résultat d'une équation qui prend homelat et homelon de la table des utilisateurs et lat, lng de la table des localisations (en gros il faut lattitude et longitude d'un point et d'un autre et calcule la distance entre ces points). Est-il possible de prendre certains paramètres à partir des deux requêtes select, de le calculer et de sortir le résultat dans l'ordre croissant?Comment commander par les résultats de 2 tables séparées en PHP et MySQL

$wynik = mysql_query("SELECT homelat, homelon FROM users WHERE guid='2'") or 
die(mysql_error()); ; 

$query = "SELECT * FROM locations WHERE timestamp"; 
$result = map_query($query); 
$points = array(); 

while ($aaa = mysql_fetch_assoc($wynik)) { 

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { 

    array_push($points, array('name'=>$row['name'], 'lat'=>$row['lat'], 
'lng'=>$row['lng'], 'description'=>$row['description'], 
'eventType'=>$row['eventType'], 'date'=>$row['date'], 
     'isotime'=>date('c', ($row['timestamp'])), 'homelat'=>$aaa['homelat'], 
'homelon'=>$aaa['homelon'])); 

} 
echo json_encode(array("Locations"=>$points)); 

Répondre

1

Ainsi, le tableau résultant devrait être quelque chose comme:

'name' => 'something', 
'lat' => 'something', 
'lng' => 'something', 
'description' => 'something', 
etc. 

Utilisez usort pour trier.

usort($array, 'sortByOption'); 
function sortByOption($a, $b) { 
    $distA = dist($a['homelat'], $a['homelong'], $a['lat'], $a['long']); 
    $distB = dist($b['homelat'], $b['homelong'], $b['lat'], $b['long']); 
    return strcmp($distA, $distB); 
} 
function dist($x1, $y1, $x2, $y2) { 
    return pow($x2 - $x1, 2) + pow($y2 - $y1, 2); 
} 

EDIT: Désolé, n'a pas 100% lu votre question. Révisé pour la solution (mais pas un excellent). Vous devriez calculer la distance dans le tableau lui-même. Et pour gagner du temps, ne faites pas la racine carrée.

EDIT 2: Résultat final.

while ($aaa = mysql_fetch_assoc($wynik)) { 
    while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { 
    array_push($points, array('name'=>$row['name'], 
           'lat'=>$row['lat'], 
           'lng'=>$row['lng'], 
         'description'=>$row['description'], 
         'eventType'=>$row['eventType'], 
           'date'=>$row['date'], 
          'isotime'=>date('c', ($row['timestamp'])), 
          'homelat'=>$aaa['homelat'], 
          'homelon'=>$aaa['homelon'], 
          'dist'=>dist($aaa['homelat'], $aaa['homelon'], $row['lat'], $row['lng']) 
    )); 
    } 
} 
usort($points, 'sortByDist'); // This sorts the points! 
echo json_encode(array("Locations"=>$points)); 
function sortByDist($a, $b) { 
    return strcmp($a['dist'], $b['dist']); 
} 
function dist($x1, $y1, $x2, $y2) { 
    return pow($x2 - $x1, 2) + pow($y2 - $y1, 2); 
} 
+0

Droite. Dois-je placer votre code juste avant echo json_encode? – Vonder

+0

Oui, sauf que les fonctions peuvent aller n'importe où. Pour gagner du temps de calcul, vous devez calculer la distance à mesure que vous sauvegardez la matrice. Donc, dans le array_push, stockez la chose dist() là-dedans. Et puis l'usort devrait seulement trier les $ a ['dist'] et $ b ['dist']. Je vais modifier pour vous montrer ce que je veux dire. –

+0

Génial, merci. – Vonder

Questions connexes