Отсортировать ассоциативный массив

136
10 июня 2021, 19:30

Есть следующий ассоциативный массив, который содержит список всех координат:

 $array =   (Array
    (
        [lat] => -42.158362
        [lng] => 147.2527163
    )
    Array
    (
        [lat] => -33.8692785
        [lng] => 150.9298603
    )
    Array
    (
        [lat] => -42.386829
        [lng] => 145.742374
    )
    Array
    (
        [lat] => -31.048654
        [lng] => 151.546292
    )
    Array
    (
        [lat] => -35.085088
        [lng] => 138.589769
    )
    Array
    (
        [lat] => -37.885309
        [lng] => 145.080471
    )
    Array
    (
        [lat] => -35.09244
        [lng] => 138.694463
    )
    Array
    (
        [lat] => -34.969993
        [lng] => 138.627648
    )
    Array
    (
        [lat] => -33.914798
        [lng] => 151.005811
    )
    Array
    (
        [lat] => -38.086152
        [lng] => 143.190695
    ))

Так же есть переменная с нужными мне координатами в виде строки

$var = "-37.885309, 145.080471-38.086152, 143.190695"

Как я могу преобразовать свой ассоциативный массив, что бы в нём остались только массивы содержащие нужные мне координаты, не меняя структуру ассоциативного массива, а остальные массивы удалить?

Answer 1
$var = "-37.885309, 145.080471-38.086152, 143.190695";
$varArr = preg_split( "/(,|-)/", $var);
$ar = [
    ...
    ...
];
array_walk($ar, function ($item1, $key) use ($varArr, &$ar) {
    if (!in_array(abs($item1['lat']), $varArr) || !in_array(abs($item1['lng']), $varArr)) {
        unset($ar[$key]);
    }
});
array_values($ar);

пример

Answer 2

С помощью регулярного выражения ищем вхождения нужных координат, в итоге получим массив со следующими элементами:

  1. $matches[1][0] — -37.885309,
  2. $matches[2][0] — 145.080471,
  3. $matches[1][1] — -38.086152,
  4. $matches[2][1] — 143.190695.

После чего в цикле перебора массива сравниваем элементы lat и lng, и записываем в результирующий массив все совпадения.

$coordinates = "-37.885309, 145.080471-38.086152, 143.190695";
preg_match_all('/(-[\d]+\.[\d]+)\,(\s[\d]+\.[\d]+)/', $coordinates, $matches);
$result = [];
foreach ($array as $key => $value) {
    if (($value['lat'] == $matches[1][0] && $value['lng'] == $matches[2][0]) ||
        ($value['lat'] == $matches[1][1] && $value['lng'] == $matches[2][1])
    ) {
        $result[] = [
            'lat' => $value['lat'],
            'lng' => $value['lng'],
        ];
    }
}
print_r($result);
READ ALSO
sql | Проблемы с русским языком

sql | Проблемы с русским языком

В базе данных русский текст отображается нормально, но когда вывожу ассоциативный массив, то получается что-то типо тоРскам

90
Как вывести простой компонент внутри шаблона другого компонента Битрикс

Как вывести простой компонент внутри шаблона другого компонента Битрикс

Я пытаюсь вызвать в шаблоне обратной связи (custom:mainfeedback), вывести соглашение о персональных данных ('bitrix:main

77
Сложная структура JSON'a (Jackson/Gson)

Сложная структура JSON'a (Jackson/Gson)

CDF DTF LEND, CDF POLO LEND, FER POLO LEND - название аккаунтов

111
Задача на создание игры РПГ

Задача на создание игры РПГ

Герой игры обладает никнеймом, силой, ловкостью и интеллектом, помимо этого у него есть здоровье, мана и опыт и позиция на карте в координатах...

488