Как повторить эту структуру в переменной массива PHP

Я отредактировал этот вопрос, чтобы ответить на него, поскольку проблема заключалась не в том, что я думал. Когда я создавал массив, я делал:

$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 за помощь в отладке в чате :)

Кажется, у вас не так много данных в $points, как в $points2 (4 записи против 9)

Nick 10.10.2018 08:38

@Nick, потому что тестовые значения в $points2 жестко закодированы из исходного кода примера, но $points основан на значениях, переданных через AJAX (просто базовый цикл, который я повторяю на $_POST['markers'], а затем пытаюсь добавить к $points массив :)

Andrew Newby 10.10.2018 08:41

@AndrewNewby Для чего вы используете [j+1] в $_POST["markers"][j+1]? Похоже, вы перепрыгиваете через запись на каждой итерации, или я ошибаюсь? Также может отсутствовать знак доллара [$j+1]?

user10004359 10.10.2018 08:43

можно ли var_экспорт ваш $ _POST?

Andreas 10.10.2018 08:43

@ D.Schaller ой да, вы правы. Не знаю, почему у меня это было! Сейчас я настроил это на $vals = $_POST['markers'][$j];, но проблема все еще возникает. Спасибо

Andrew Newby 10.10.2018 08:52

@Andreas Готово. См. OP

Andrew Newby 10.10.2018 09:00

@AndrewNewby Вы немного отредактировали и преобразовали $j <= count в $j < count, это решило вашу проблему, потому что я хотел решить эту проблему, но не видел редактирования: x

user10004359 10.10.2018 09:09

@AndrewNewby Также вы понимаете, что $points2 = array(...) поврежден строками, верно? array("location" => array(-1.1685350,44.6591050, array("foo" => "bar") )),. Наверное, это основная причина, по которой у вас не получается разобраться с $points2.

user10004359 10.10.2018 09:16

@ D.Schaller, спасибо. Я исправил эту часть $ k <= count, но это не устранило проблему. На самом деле, похоже, больше проблем с самим исходным скриптом заключается в том, как он обрабатывает позиции - он выполняет round() и конвертирует его в 2dp. Проблема в том, что большинство маркеров находятся рядом друг с другом, поэтому у вас может быть 44.0000001 и 44.0000005 с разными значениями длины, но затем кажется, что этот код падает, поскольку оба числа равны 44,00, хотя их не должно быть: /

Andrew Newby 10.10.2018 09:21

Это прискорбно, но я не могу придумать вескую причину для преобразования позиций на long / lat в 2dp ... Это своего рода действительно большой округление вверх / вниз для координат.

user10004359 10.10.2018 09:24

Д.Шаллер: да, я тоже. Может быть, что-то на этой странице дает повод? rtsoftwaregroup.io/server-side-google-map-markers-clustering (отсюда исходный скрипт). Или, может быть, вы знаете лучший скрипт для преобразования списка широты / долготы в кластеры, готовые для использования на картах Google? Проблема в том, что некоторые категории содержат более 2000 записей, и это вызывает серьезные проблемы с производительностью на компьютерах. Что нам нужно сделать, так это создать кластеры на сервере, а не во внешнем интерфейсе, а затем показывать маркеры только при увеличении большего размера.

Andrew Newby 10.10.2018 09:25

Позвольте нам продолжить обсуждение в чате.

user10004359 10.10.2018 09:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
12
63
1

Ответы 1

Вы можете использовать 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"
  }
}

https://3v4l.org/5Siqs

Спасибо за ответ. Я только что обновил вопрос, добавив немного дополнительной информации. Проблема с вашим решением заключается в том, что я действительно хочу, чтобы были переданы и остальные значения (а не только широта и долгота), поэтому мой подход. Когда код полностью заработает, ему нужно будет вернуть значения из этого маркера, если он не находится в кластере (чтобы его можно было отобразить на карте). Я вынул эту часть из кода, хотя она не имеет отношения к этой части вопроса :)

Andrew Newby 10.10.2018 09:19

Другие вопросы по теме