php формирование json для yandex карт

343
22 июня 2017, 06:30

Не получается сформировать json из php:

 <?
 require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
 $mask = array();
 if (CModule::IncludeModule("iblock")){
    $arSelect = Array("ID", "IBLOCK_ID", "NAME", "DATE_ACTIVE_FROM","PROPERTY_*");
    $arFilter = Array("IBLOCK_ID"=>14, "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y");
    $res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
    $i = 1;
    while($ob = $res->GetNextElement()){ 
        $arProps = $ob->GetProperties();
        $arFields = $ob->GetFields();
        $ccords = explode(",", $arProps['coords']['VALUE']);
        $mask['features'][] =  array(
        "type" => "Feature",
        "id"=>$arFields["ID"],
        "geometry" => array (
            "type" => "Point",
            "coordinates" => [$ccords[1],$ccords[0]]
        ),
        "properties" => array (
        "balloonContentHeader" => "<font size=3><b><a target='_blank' href='https://yandex.ru'>Здесь может быть ваша ссылка</a></b></font>",
        "balloonContentBody" => "<p>Ваше имя: <input name='login'></p><p><em>Телефон в формате 2xxx-xxx:</em>  <input></p><p><input type='submit' value='Отправить'></p>",
        "balloonContentFooter" => "<font size=1>Информация предоставлена: </font> <strong>этим балуном</strong>", 
        "clusterCaption" => "<strong><s>Еще</s> одна</strong> метка",
        "hintContent" => "<strong>Текст  <s>подсказки</s></strong>"
        )
        );
        $i++;
    }
 }
 echo json_encode($mask,JSON_UNESCAPED_UNICODE);
 ?>

получаю такой вывод:

{"features":[{"type":"Feature","id":"99","geometry":{"type":"Point","coordinates":["38.063632","54.922348"]},"properties":{"balloonContentHeader":"<font size=3><b><a target='_blank' href='https:\/\/yandex.ru'>Здесь может быть ваша ссылка<\/a><\/b><\/font>","balloonContentBody":"<p>Ваше имя: <input name='login'><\/p><p><em>Телефон в формате 2xxx-xxx:<\/em>  <input><\/p><p><input type='submit' value='Отправить'><\/p>","balloonContentFooter":"<font size=1>Информация предоставлена: <\/font> <strong>этим балуном<\/strong>","clusterCaption":"<strong><s>Еще<\/s> одна<\/strong> метка","hintContent":"<strong>Текст  <s>подсказки<\/s><\/strong>"}},

А хотелось бы:

{
"type": "FeatureCollection",
"features": [
    {"type":"Feature","id":99,"geometry":{"type":"Point","coordinates":[38.063632","54.922348]},"properties":{"balloonContentHeader":"<font size=3><b><a target='_blank' href='https:\/\/yandex.ru'>Здесь может быть ваша ссылка<\/a><\/b><\/font>","balloonContentBody":"<p>Ваше имя: <input name='login'><\/p><p><em>Телефон в формате 2xxx-xxx:<\/em>  <input><\/p><p><input type='submit' value='Отправить'><\/p>","balloonContentFooter":"<font size=1>Информация предоставлена: <\/font> <strong>этим балуном<\/strong>","clusterCaption":"<strong><s>Еще<\/s> одна<\/strong> метка","hintContent":"<strong>Текст  <s>подсказки<\/s><\/strong>"}}

Подскажите, как записать?

Answer 1

Да, вижу в комментариях вам teran вроде подсказал что и как, я б еще посоветовал все это написать более экономно(производительность)

 <?require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
 $mask = array(); 
 $mask['type'] = 'FeatureCollection'; // добавляем то, чего вам не хватало
 if (\CModule::IncludeModule("iblock")) {
      $arSelect = Array("ID", "PROPERTY_COORDS"); // в цикле вы ничего больше не используете, это излишки
      $arFilter = Array("IBLOCK_ID"=>14, "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y");
      $res = \CIBlockElement::GetList(array(), $arFilter, false, false, $arSelect);
      // $i = 1; зачем вам $i ?
      // fetch быстрее работает, и в $arSelect мы берем только то, что нам нужно
      while($arr = $res->Fetch()){ 
           $ccords = explode(",", $arr['PROPERTY_COORDS_VALUE']);
           $mask['features'][] =  array(
                "type" => "Feature",
                "id"=> intval($arr['ID']),
                "geometry" => array (
                      "type" => "Point",
                      "coordinates" => [floatval($ccords[1]), floatval($ccords[0])]
                ),
                "properties" => array (
                       "balloonContentHeader" => "<font size=3><b><a target='_blank' href='https://yandex.ru'>Здесь может быть ваша ссылка</a></b></font>",
                       "balloonContentBody" => "<p>Ваше имя: <input name='login'></p><p><em>Телефон в формате 2xxx-xxx:</em>  <input></p><p><input type='submit' value='Отправить'></p>",
                       "balloonContentFooter" => "<font size=1>Информация предоставлена: </font> <strong>этим балуном</strong>", 
                       "clusterCaption" => "<strong><s>Еще</s> одна</strong> метка",
                       "hintContent" => "<strong>Текст  <s>подсказки</s></strong>"
                 )
          );
    // $i++; зачем?
   }
}
echo json_encode($mask,JSON_UNESCAPED_UNICODE);

p.s. постарался минимально затронуть наз-я переменных, но желательно тоже использовать смысловую нагрузку в них.

Тут я вам просто советую, как лучше, ни в коем случае не влезаю в ваш код :)

READ ALSO
почему ничего не покаывается

почему ничего не покаывается

нашёл пример работы создания дерева но не могу выполнить помогите

236
WordPress ест ОЗУ, почему?

WordPress ест ОЗУ, почему?

Здравствуйте!

189
Сортировка класса в PHP

Сортировка класса в PHP

Имею класс PHP с объектами:

257
Как отловить параметры Get вида index.php?do=somethink в Laravel

Как отловить параметры Get вида index.php?do=somethink в Laravel

Как отловить параметры Get вида indexphp?do=somethink в Laravel

281