Сортировка массива из БД по расстоянию Google API (usort)

0

Я получаю адрес и имя из базы данных, и я хочу сортировать результаты на основе расстояния, которое рассчитывается API Карт Google после того, как он получает адресат от запроса. В настоящее время он отображает следующие сообщения об ошибках 4 раза (повторяя их):

Warning: Illegal string offset 'routes' in C:\xampp\htdocs\app2\test.php on line 36

Warning: Illegal string offset 'legs' in C:\xampp\htdocs\app2\test.php on line 36

Warning: Illegal string offset 'distance' in C:\xampp\htdocs\app2\test.php on line 36

Warning: Illegal string offset 'text' in C:\xampp\htdocs\app2\test.php on line 36 

Печатный массив отображается после ошибок и выглядит так:

Array ( [0] => 0.3 km [1] => 1.7 km ) 

Я хочу, чтобы результатом было имя ($row['name']) и количество километров, отсортированных по возрастанию в зависимости от километров. Как должен выглядеть мой смысл, чтобы достичь этого? Или есть проблема где-то еще?

Вот мой код:

<?php
require_once 'includes/session.php';
require_once 'includes/config.php';
require_once 'includes/design_query.php';
include_once 'includes/header.php';
include_once 'includes/menu.php';

//$origin = $_COOKIE['origin'];
//$id=$_GET['id'];

$origin = "Bucuresti+Avrig+30";
$id = 3;
$query = ("SELECT * FROM locations WHERE category_id='$id'");
$result = mysql_query($query) or die (mysql_error());
while($row = mysql_fetch_array($result))
{
$address = $row['Judet'] . '+' . $row['Localitate'] . '+' . $row['Strada'] . '+' . $row['Numar'];
$address = str_replace(' ', '+', $address);

$fullurl = 'http://maps.googleapis.com/maps/api/directions/json?origin=' . $origin . '&destination=' . $address .  '&alternatives=true&sensor=true';
$json_a = json_decode((file_get_contents($fullurl)),true); 

asort($row);

//echo $row['name'];
//echo "<span class='badge'>" . $json_a['routes'][0]['legs'][0]['distance']['text'] . "</span></button>";

$whole_data[] = $json_a['routes'][0]['legs'][0]['distance']['text'];
}

 function cmp($a, $b)
    {
        if ($a['routes'][0]['legs'][0]['distance']['text'] == $b['routes'][0]['legs'][0]['distance']['text']) {
            return 0;
        }
        return ($a['routes'][0]['legs'][0]['distance']['text'] < $b['routes'][0]['legs'][0]['distance']['text']) ? -1 : 1;
    }

    $a = array(3, 2, 5, 6, 1);

    usort($whole_data, "cmp");

    print_r($whole_data);

include_once 'includes/footer.php';
include_once 'includes/scripts.php';
?>
Теги:
arrays
google-maps

1 ответ

0
Лучший ответ

Прежде всего позвольте мне сказать, что этот код беспорядок! Видя прокомментированную строку, в которой идентификатор получен из GET, также становится понятным, что он будет подвержен внедрению sql.

В любом случае, это попытка сделать так, как вам хочется (только важные части):

while($row = mysql_fetch_array($result))
{
$address = $row['Judet'] . '+' . $row['Localitate'] . '+' . $row['Strada'] . '+' . $row['Numar'];
$address = str_replace(' ', '+', $address);

$fullurl = 'http://maps.googleapis.com/maps/api/directions/json?origin=' . $origin . '&destination=' . $address .  '&alternatives=true&sensor=true';
$json_a = json_decode((file_get_contents($fullurl)),true); 



$whole_data[] = array("name" => $row["name"], "value" => $json_a['routes'][0]['legs'][0]['distance']['value'],  "text" => $json_a['routes'][0]['legs'][0]['distance']['text']);
}

 function cmp($a, $b)
    {
        if ($a['value'] == $b['value']) {
            return 0;
        }
        return ($a['value'] < $b['value']) ? -1 : 1;
    }


    usort($whole_data, "cmp");
// example print
foreach($whole_data as $row){
    echo "$row[name] $row[text] <br/>";
}
  • 0
    Да, это беспорядок. Он будет интегрирован в приложение телефона, поэтому пользователь сам не будет загружать страницу в браузере. Он также использует MySQL вместо MySQLi или PDO. После того, как вы изменили мой код, как вы предложили, получим: Array ([0] => Array ([name] => Hotel Artemis [value] => 314 [text] => 0.3 km) [1] => Array ([name ] => Hotel Marriott [value] => 1703 [text] => 1,7 км)) Как я могу отсортировать его сейчас? Я думаю, мне нужно использовать foreach?
  • 0
    это уже отсортировано ASC по значению расстояния. Это делается через вызов usort.
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню