Я отредактировал этот вопрос, чтобы ответить на него, поскольку проблема заключалась не в том, что я думал. Когда я создавал массив, я делал:
$points[] = array("location" => array( $markers[$j]['latitude'] , $markers[$j]['longitude'] ) );
Почему-то захотелось:
$points[] = array("location" => array( floatvar($markers[$j]['latitude']) , floatvar($markers[$j]['longitude']) ) );
Я не совсем уверен, почему это было так, но, похоже, это помогло мне. Итак, конечный код выглядел так:
for ($j = 0; $j < count($markers); $j++) {
$points[] = array("location" => array( $markers[$j]['latitude'] , $markers[$j]['longitude'] ) );
}
Особая благодарность @ D.Schaller за помощь в отладке в чате :)
@Nick, потому что тестовые значения в $points2 жестко закодированы из исходного кода примера, но $points основан на значениях, переданных через AJAX (просто базовый цикл, который я повторяю на $_POST['markers'], а затем пытаюсь добавить к $points массив :)
@AndrewNewby Для чего вы используете [j+1] в $_POST["markers"][j+1]? Похоже, вы перепрыгиваете через запись на каждой итерации, или я ошибаюсь? Также может отсутствовать знак доллара [$j+1]?
можно ли var_экспорт ваш $ _POST?
@ D.Schaller ой да, вы правы. Не знаю, почему у меня это было! Сейчас я настроил это на $vals = $_POST['markers'][$j];, но проблема все еще возникает. Спасибо
@Andreas Готово. См. OP
@AndrewNewby Вы немного отредактировали и преобразовали $j <= count в $j < count, это решило вашу проблему, потому что я хотел решить эту проблему, но не видел редактирования: x
@AndrewNewby Также вы понимаете, что $points2 = array(...) поврежден строками, верно? array("location" => array(-1.1685350,44.6591050, array("foo" => "bar") )),. Наверное, это основная причина, по которой у вас не получается разобраться с $points2.
@ D.Schaller, спасибо. Я исправил эту часть $ k <= count, но это не устранило проблему. На самом деле, похоже, больше проблем с самим исходным скриптом заключается в том, как он обрабатывает позиции - он выполняет round() и конвертирует его в 2dp. Проблема в том, что большинство маркеров находятся рядом друг с другом, поэтому у вас может быть 44.0000001 и 44.0000005 с разными значениями длины, но затем кажется, что этот код падает, поскольку оба числа равны 44,00, хотя их не должно быть: /
Это прискорбно, но я не могу придумать вескую причину для преобразования позиций на long / lat в 2dp ... Это своего рода действительно большой округление вверх / вниз для координат.
Д.Шаллер: да, я тоже. Может быть, что-то на этой странице дает повод? rtsoftwaregroup.io/server-side-google-map-markers-clustering (отсюда исходный скрипт). Или, может быть, вы знаете лучший скрипт для преобразования списка широты / долготы в кластеры, готовые для использования на картах Google? Проблема в том, что некоторые категории содержат более 2000 записей, и это вызывает серьезные проблемы с производительностью на компьютерах. Что нам нужно сделать, так это создать кластеры на сервере, а не во внешнем интерфейсе, а затем показывать маркеры только при увеличении большего размера.
Позвольте нам продолжить обсуждение в чате.






Вы можете использовать array_intersect_key, который будет выбирать элементы из массива, соответствующие ключам $ match.
// Create placeholder array to match against
$match = ['longitude' => "", 'latitude' => ""];
foreach($_POST['markers'] as $sub){
$new[] = array_intersect_key($sub, $match);
}
var_dump($new);
Выход:
array(10) {
[0]=>
array(2) {
["latitude"]=>
string(11) "45.26429390"
["longitude"]=>
string(11) "-0.91037940"
}
[1]=>
array(2) {
["latitude"]=>
string(19) "44.8247082823002360"
["longitude"]=>
string(20) "-0.58459281921386720"
}
[2]=>
array(2) {
["latitude"]=>
string(10) "44.6015560"
["longitude"]=>
string(20) "-1.08606009999994060"
}
[3]=>
array(2) {
["latitude"]=>
string(10) "44.7300940"
["longitude"]=>
string(20) "-1.04289489999996470"
}
[4]=>
array(2) {
["longitude"]=>
string(20) "-1.17691170000000510"
["latitude"]=>
string(10) "44.6437140"
}
[5]=>
array(2) {
["latitude"]=>
string(18) "45.068182578090370"
["longitude"]=>
string(20) "-1.14553928375244140"
}
[6]=>
array(2) {
["longitude"]=>
string(15) "-0.593261718750"
["latitude"]=>
string(18) "44.331707186809210"
}
[7]=>
array(2) {
["latitude"]=>
string(18) "44.721281586556690"
["longitude"]=>
string(21) "-0.453948412793351960"
}
[8]=>
array(2) {
["latitude"]=>
string(18) "44.833484299999990"
["longitude"]=>
string(20) "-0.56840629999999240"
}
[9]=>
array(2) {
["longitude"]=>
string(20) "-0.58094501495361330"
["latitude"]=>
string(18) "45.144727399384470"
}
}
Спасибо за ответ. Я только что обновил вопрос, добавив немного дополнительной информации. Проблема с вашим решением заключается в том, что я действительно хочу, чтобы были переданы и остальные значения (а не только широта и долгота), поэтому мой подход. Когда код полностью заработает, ему нужно будет вернуть значения из этого маркера, если он не находится в кластере (чтобы его можно было отобразить на карте). Я вынул эту часть из кода, хотя она не имеет отношения к этой части вопроса :)
Кажется, у вас не так много данных в
$points, как в$points2(4 записи против 9)