За последние 24 часа нас посетили 43033 программиста и 2845 роботов. Сейчас ищут 2275 программистов ...

Поиск ближайшего числа в двухмерном массиве

Тема в разделе "PHP для новичков", создана пользователем Dark19, 9 июн 2014.

  1. Dark19

    Dark19 Активный пользователь

    С нами с:
    10 май 2014
    Сообщения:
    51
    Симпатии:
    0
    Здравствуйте, подскажите как осуществить такую задачу: есть записи в бд типа varchar (геокоординаты: долгота, широта), например такие -
    1) 40.4392932585, 50.4309248194
    2) 43.4543676294, 35.4466803768
    3) 44.3466867954, 38.7946465478
    ...
    и есть двухмерный массив который приходит из js, например с такими числами:
    47.3464865161, 39.7944364742

    и нужно сровнять с этим массивом который приходит в php скрипт все эти записи с бд не разделяя каждую запись или массив на два разных числа (не разделяя долготу и широту) и найти запись из бд, которая ближе всего к этим числам в массиве.
    Как осуществить такое может кто знает?
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.132
    Симпатии:
    1.251
    Адрес:
    там-сям
    Вроде для гео-данных в БД есть специальные функции вроде расстояние_до(точка). Остается только MIN() применить.

    p.s. вот что-то про расстояние, оптимизацию и ограничения в данной задаче + MySQL
    http://www.mysqlperformanceblog.com/2013/10/21/using-the-ne ... lications/
     
  3. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Возникает ощущение что вы, пардон, пытаетесь чистить зубы через задницу.
    Во-первых, работая с геоданными никогда не нужно хранить в 1 поле долготу и широту точки.
    Во-вторых использовать нужно не тип варчар, а point (мускул), или иной тип, принятый в вашей субд для хранения геоданных.
    После указанных изменений ваши задачи сразу станут простыми и приятными.
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.132
    Симпатии:
    1.251
    Адрес:
    там-сям
    ключевое слово: spatial
     
  5. Dark19

    Dark19 Активный пользователь

    С нами с:
    10 май 2014
    Сообщения:
    51
    Симпатии:
    0
    а вот как разделить строку(я ее беру из инпута, я так понимаю там строка приходит) с этими числами(44.3466867954,38.7946465478) на два числа, чтобы записать в бд в тип point?
     
  6. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
  7. Dark19

    Dark19 Активный пользователь

    С нами с:
    10 май 2014
    Сообщения:
    51
    Симпатии:
    0
    пробовал, что-то не записывает в бд
     
  8. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Так в чем проблема, разделить или записать?
     
  9. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Читайте ману... http://www.php.net/manual/ru/
     
  10. Dark19

    Dark19 Активный пользователь

    С нами с:
    10 май 2014
    Сообщения:
    51
    Симпатии:
    0
    я делаю вот так
    Код (Text):
    1.  $s = $_POST['start'];
    2.     $start = explode(", ", $s);
    3.  
    4.     mysql_query( "INSERT INTO delivery(address, start, date, term, weight)
    5.                             VALUES ('$address', '$start[0]', '$date', '$term', '$weight') ");
     
  11. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Проверьте, не поставились ли у вас "магические кавычки" (magic_quotes_gpc)
     
  12. Dark19

    Dark19 Активный пользователь

    С нами с:
    10 май 2014
    Сообщения:
    51
    Симпатии:
    0
    уже пробую выбрать по регулярке:
    Код (Text):
    1. $text = "49.80560256354139,28.118890437499996";
    2. $test = preg_split('\d+\.\d+', $text);
    3. echo $test;
    но выдает ошибку: Warning: preg_split() [function.preg-split]: Delimiter must not be alphanumeric or backslash in Z:\home\Geo\www\ajax.php on line 69
     
  13. Dark19

    Dark19 Активный пользователь

    С нами с:
    10 май 2014
    Сообщения:
    51
    Симпатии:
    0
    как на php выбрать с такой строки: 49.80560256354139,28.118890437499996 все что до запятой в одну переменную, а все что после в другую?
     
  14. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
  15. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Вам правильно сказали, explode тут идеально, а если уж пользуетесь регуляркой, то хоть пишите ее правильно. Регулярка тут будет - либо preg_split('~,~', ......), либо preg_match('~(\d\.)+,(\d\.)+~', .....)