Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как из php файла передать данные в переменную javascript (https://javascript.ru/forum/misc/63812-kak-iz-php-fajjla-peredat-dannye-v-peremennuyu-javascript.html)

angelzzz 01.07.2016 10:01

Как из php файла передать данные в переменную javascript
 
Через API получаю данные от стороннего сервиса. Структура ответа:

[ { 
        ...     
        “Latitude”: “<Широта>”,
        “Longitude”:    “<Долгота>”,
        ...
} ]


С помощью php файла getdata.php прохожу по массиву и собираю все данные

foreach ($response as $item) {
    $a = "[".$item['Latitude'].",".$item['Longitude']."]," ;   
    $array = $array.$a ;
}

    $list= substr($array, 0, -1);
    echo json_encode($list);


Это список точек, который я хочу отобразить на карте с помощью Яндекс.Карты API.

var myMap = new ymaps.Map('map', {
...
    points = [
        [55.831903,37.411961], [55.763338,37.565466]
    ],
}


Как мне передать данные переменной $list в points?
Вопрос по корректности кода в php? Он вроде выводит верные данные, но нужно ли делать json_encode и можно ли заменить substr($array, 0, -1); на что-то внутри foreach?

Viral 01.07.2016 12:29

$array не должен быть строкой, похожей на массив, сделайте переменную полноценным массивом, в строку JSON ее превратит json_encode

angelzzz 01.07.2016 12:58

Можно пример как мне сделать массив из Latitude и Longitude в таком виде [55.831903,37.411961] ?

Viral 01.07.2016 13:02

например, так:
$array = [];
foreach ($response as $i){
	$arr = [$item['Latitude'],$item['Longitude']];
	array_push($array,$arr);
}
echo json_encode($array);

laimas 01.07.2016 13:04

foreach ($response as $item) в данном случае вообще некчемная операция. Если $response, это массив, вложения которого массивы хранящие значения координат, то вместо всего написанного достаточно json_encode($response).

angelzzz 01.07.2016 13:08

структура ответа больше:
[
{	
		“Id“:		“<Id>”,
		“OwnerId”:	”<Owner_id>”,
		“CitiId”:		“<Id города >”,
		“Number”:	”<номер >”,
		“Address”:	”<адрес >”,
		“Latitude”:	“<Широта>”,
		“Longitude”:	“<Долгота>”,
}
]

и еще более 20 полей. Можно тут обойтись без foreach ($response as $item) ?

laimas 01.07.2016 13:11

Цитата:

Сообщение от angelzzz
Можно тут обойтись без foreach ($response as $item) ?

Вы на свой код внимательно посмотрите, в нем нет никакого смысла, ибо вы пытаетесь в нем создать "самопальный" json_encode, а зачем?

angelzzz 01.07.2016 13:13

Ошибка syntax error, unexpected '[' в строке
$array = [];

Viral 01.07.2016 13:15

Цитата:

Сообщение от angelzzz (Сообщение 420975)
Ошибка syntax error, unexpected '[' в строке
$array = [];

удалите денвер и поставьте вебсервер с пыхой 5.4+

Viral 01.07.2016 13:16

laimas,
ну не хочет человек передавать 20 лишних параметров клиенту)

laimas 01.07.2016 13:16

Покажите результат этого

<pre>
<?php
print_r($response);
?>
</pre>

angelzzz 01.07.2016 13:28

Цитата:

Сообщение от Viral (Сообщение 420976)
удалите денвер и поставьте вебсервер с пыхой 5.4+

это рабочий сервер в пхп 5.4

angelzzz 01.07.2016 13:30

Цитата:

Сообщение от laimas (Сообщение 420978)
Покажите результат этого

<pre>
<?php
print_r($response);
</pre>

вы меня совсем запутали. код выглядит как франкенштейн :stop:
Где вы хотите, чтобы я это написал? В пхп? в html?

Viral 01.07.2016 13:33

Цитата:

Сообщение от angelzzz (Сообщение 420983)
вы меня совсем запутали. код выглядит как франкенштейн :stop:
Где вы хотите, чтобы я это написал? В пхп? в html?

ахах)) видимо, в тетрадке)

laimas 01.07.2016 13:37

Цитата:

Сообщение от angelzzz
Где вы хотите, чтобы я это написал? В пхп? в html?

Читать здесь

angelzzz 01.07.2016 13:38

Ок. Закрываю тему. Больше вопросов, чем ответов. Если бы я знал как это делается, то на форум бы не обращался.

laimas 01.07.2016 13:40

Цитата:

Сообщение от angelzzz
Ок. Закрываю тему. Больше вопросов, чем ответов.


Вы на 100% действуете не правильно, а чтобы показать "на пальцах" почему, вас просят показать (распечатать) структуру массива $response. Это что сложно сделать, а читать матчасть западло?

angelzzz 01.07.2016 14:08

Цитата:

Сообщение от laimas (Сообщение 420990)
Вы на 100% действуете не правильно, а чтобы показать "на пальцах" почему, вас просят показать (распечатать) структуру массива $response. Это что сложно сделать, а читать матчасть западло?

выводит полотно:

Array
(
    [0] => Array
        (
            [Id] => 1122
            [Latitude] => 55.682675
            [LocationType] => 1
            [Longitude] => 37.897516
            [Opening] => 
            [OwnerId] => 923
        )

    [1] => Array
        (
            [Id] => 1136
            [Latitude] => 55.682661
            [LocationType] => 1
            [Longitude] => 37.886621
            [Opening] => 
            [OwnerId] => 923
        )

    [2] => Array
и тд

Viral 01.07.2016 14:14

laimas был прав, можно ограничиться
echo json_encode($response);

angelzzz 01.07.2016 14:21

Цитата:

Сообщение от Viral (Сообщение 420999)
laimas был прав, можно ограничиться
echo json_encode($response);

как потом данные Latitude и Longitude получить в переменной points в js, который исполняется в файле index.html?

Viral 01.07.2016 14:25

angelzzz, вы, вероятно, обращаетесь аяксом к файлу getdata.php?
Если так, то
var points = JSON.parse(response);

angelzzz 01.07.2016 14:36

Если я убираю всю конструкцию foreach,

и делаю просто echo json_encode($response);
то возможно нет смысла в этих строках:

$response = json_decode($result, true);
$id = $response[0]['Id'];


вот в этой части?

$result = curl_exec($ch);

$response = json_decode($result, true);
$id = $response[0]['Id'];

echo json_encode($response);


и можно просто echo $result

Только и тот и другой код выводит

{"Id":1122,"Latitude":55.682675,"LocationType":1," Longitude":37.897516,"Opening":false,"OutDescripti on":"\u041f\u0443\u043d\u043a\u0442 \u0432\u044b\u0434\u0430\u0447\u0438 \u0437\u0430\u043a\u0430\u0437\u043e\u0432 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u 044f \u0432 \u043e\u0442\u0434\u0435\u043b\u0435\u043d\u0438\u 0435 \u041b\u041f\u0422\u0423\u0421. \u041f\u0435\u0448\u043a\u043e\u043c: \u0436\/\u0434 \u0441\u0442. \u041b\u044e\u0431\u0435\u0440\u0446\u044b-1, \u0421\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430. \u041f\u0440\u043e\u0439\u0442\u0438 \u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u0441\u0435\u0440\u043e-\u0433\u043e\u043b\u0443\u0431\u043e\u043c\u0443 2-\u044d\u0442\u0430\u0436\u043d\u043e\u043c\u0443 \u0437\u0434\u0430\u043d\u0438\u044e \u0441 \u0432\u044b\u0432\u0435\u0441\u043a\u043e\u0439 \u042d\u043a\u0441\u043f\u0440\u0435\u0441\u0441-\u0421\u0432\u044f\u0437\u044c. \u041d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u 044f \u043c\u0435\u0436\u0434\u0443 \u0430\u0432\u0442\u043e\u0441\u0442\u0430\u043d\u 0446\u0438\u0435\u0439 \u0438 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u 044c\u043d\u044b\u043c

Viral 01.07.2016 14:40

Ну да, можно отправить клиенту $result и распарсить его JS'ом уже в браузере.

laimas 01.07.2016 14:47

angelzzz,
json_encode($response, JSON_UNESCAPED_UNICODE)
и национальные символы не будут преобразовываться в юникод, что сократит объем передаваемых данных.

angelzzz 01.07.2016 14:47

Цитата:

Сообщение от Viral (Сообщение 421007)
Ну да, можно отправить клиенту $result и распарсить его JS'ом уже в браузере.

Мы конечно сейчас оптимизировали код пхп, но собственно вопрос был в другом - я хочу вставить данные из пхп файл в файле, где выполняется яндекс карта и там устанавливаются точки на этой карте

laimas 01.07.2016 14:50

Цитата:

Сообщение от angelzzz
я хочу вставить данные из пхп файл

На клиенте уже нет файлов, есть объект points

var points = JSON.parse(response)

получайте его свойства

points[0].Latitude и т.д.

angelzzz 01.07.2016 14:55

Цитата:

Сообщение от laimas (Сообщение 421011)
На клиенте уже нет файлов, есть объект points

var points = JSON.parse(response)

получайте его свойства

points[0].Latitude и т.д.

я работаю в цмс MODx, из нее я вызываю php файл, и как мне вызвать эти данные не в php файле, а в другом, где собственно выполняется js с картой?

angelzzz 01.07.2016 15:01

Давайте попробую заново сформулировать вопрос:

есть АПИ сторонний, откуда я получаю в ответ

Array
(
    [0] => Array
        (
            [Id] => 1122
            [Latitude] => 55.682675
            [LocationType] => 1
            [Longitude] => 37.897516
            [Opening] => 
            [OwnerId] => 923
        )

    [1] => Array
        (
            [Id] => 1136
            [Latitude] => 55.682661
            [LocationType] => 1
            [Longitude] => 37.886621
            [Opening] => 
            [OwnerId] => 923
        )

    [2] => Array

и таких массивов около 1500 тысяч, количество полей урезал для удобства, их там более 30

С помощью php файла getdata.php я делаю запрос в этот АПИ

echo $result


Теперь мне в файле index.html нужно получить значения Latitude и Longitude в переменной points в таком виде [55.831903,37.411961]

points = [
            [55.831903,37.411961], [55.763338,37.565466], [55.763338,37.565466], [55.744522,37.616378], [55.780898,37.642889], [55.793559,37.435983], [55.800584,37.675638], [55.716733,37.589988], [55.775724,37.560840], [55.822144,37.433781], [55.874170,37.669838], [55.716770,37.482338], [55.780850,37.750210], [55.810906,37.654142], [55.865386,37.713329], [55.847121,37.525797], [55.778655,37.710743], [55.623415,37.717934], [55.863193,37.737000], [55.866770,37.760113], [55.698261,37.730838], [55.633800,37.564769], [55.639996,37.539400], [55.690230,37.405853], [55.775970,37.512900], [55.775777,37.442180], [55.811814,37.440448], [55.751841,37.404853], [55.627303,37.728976], [55.816515,37.597163], [55.664352,37.689397], [55.679195,37.600961], [55.673873,37.658425], [55.681006,37.605126], [55.876327,37.431744], [55.843363,37.778445], [55.875445,37.549348], [55.662903,37.702087], [55.746099,37.434113], [55.838660,37.712326], [55.774838,37.415725], [55.871539,37.630223], [55.657037,37.571271], [55.691046,37.711026], [55.803972,37.659610], [55.616448,37.452759], [55.781329,37.442781], [55.844708,37.748870], [55.723123,37.406067], [55.858585,37.484980]
        ],


ymaps.ready(function () {
    var myMap = new ymaps.Map('map', {
            center: [55.751574, 37.573856],
            zoom: 9,
            behaviors: ['default', 'scrollZoom']
        }, {
            searchControlProvider: 'yandex#search'
        }),
        /**
         * Создадим кластеризатор, вызвав функцию-конструктор.
         * Список всех опций доступен в документации.
         * @see [url]https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/Clusterer.xml#constructor-summary[/url]
         */
            clusterer = new ymaps.Clusterer({
            /**
             * Через кластеризатор можно указать только стили кластеров,
             * стили для меток нужно назначать каждой метке отдельно.
             * @see [url]https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/option.presetStorage.xml[/url]
             */
            preset: 'islands#invertedVioletClusterIcons',
            /**
             * Ставим true, если хотим кластеризовать только точки с одинаковыми координатами.
             */
            groupByCoordinates: false,
            /**
             * Опции кластеров указываем в кластеризаторе с префиксом "cluster".
             * @see [url]https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/ClusterPlacemark.xml[/url]
             */
            clusterDisableClickZoom: true,
            clusterHideIconOnBalloonOpen: false,
            geoObjectHideIconOnBalloonOpen: false
        }),
        /**
         * Функция возвращает объект, содержащий данные метки.
         * Поле данных clusterCaption будет отображено в списке геообъектов в балуне кластера.
         * Поле balloonContentBody - источник данных для контента балуна.
         * Оба поля поддерживают HTML-разметку.
         * Список полей данных, которые используют стандартные макеты содержимого иконки метки
         * и балуна геообъектов, можно посмотреть в документации.
         * @see [url]https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/GeoObject.xml[/url]
         */
            getPointData = function (index) {
            return {
                balloonContentBody: 'балун <strong>метки ' + index + '</strong>',
                clusterCaption: 'метка <strong>' + index + '</strong>'
            };
        },
        /**
         * Функция возвращает объект, содержащий опции метки.
         * Все опции, которые поддерживают геообъекты, можно посмотреть в документации.
         * @see [url]https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/GeoObject.xml[/url]
         */
            getPointOptions = function () {
            return {
                preset: 'islands#violetIcon'
            };
        },
        points = [
            [55.831903,37.411961], [55.763338,37.565466], [55.763338,37.565466], [55.744522,37.616378], [55.780898,37.642889], [55.793559,37.435983], [55.800584,37.675638], [55.716733,37.589988], [55.775724,37.560840], [55.822144,37.433781], [55.874170,37.669838], [55.716770,37.482338], [55.780850,37.750210], [55.810906,37.654142], [55.865386,37.713329], [55.847121,37.525797], [55.778655,37.710743], [55.623415,37.717934], [55.863193,37.737000], [55.866770,37.760113], [55.698261,37.730838], [55.633800,37.564769], [55.639996,37.539400], [55.690230,37.405853], [55.775970,37.512900], [55.775777,37.442180], [55.811814,37.440448], [55.751841,37.404853], [55.627303,37.728976], [55.816515,37.597163], [55.664352,37.689397], [55.679195,37.600961], [55.673873,37.658425], [55.681006,37.605126], [55.876327,37.431744], [55.843363,37.778445], [55.875445,37.549348], [55.662903,37.702087], [55.746099,37.434113], [55.838660,37.712326], [55.774838,37.415725], [55.871539,37.630223], [55.657037,37.571271], [55.691046,37.711026], [55.803972,37.659610], [55.616448,37.452759], [55.781329,37.442781], [55.844708,37.748870], [55.723123,37.406067], [55.858585,37.484980]
        ],
        geoObjects = [];

    /**
     * Данные передаются вторым параметром в конструктор метки, опции - третьим.
     * @see [url]https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/Placemark.xml#constructor-summary[/url]
     */
    for(var i = 0, len = points.length; i < len; i++) {
        geoObjects[i] = new ymaps.Placemark(points[i], getPointData(i), getPointOptions());
    }

    /**
     * Можно менять опции кластеризатора после создания.
     */
    clusterer.options.set({
        gridSize: 80,
        clusterDisableClickZoom: true
    });

    /**
     * В кластеризатор можно добавить javascript-массив меток (не геоколлекцию) или одну метку.
     * @see [url]https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/Clusterer.xml#add[/url]
     */
    clusterer.add(geoObjects);
    myMap.geoObjects.add(clusterer);

    /**
     * Спозиционируем карту так, чтобы на ней были видны все объекты.
     */

    myMap.setBounds(clusterer.getBounds(), {
        checkZoomRange: true
    });
});


Как это сделать?

laimas 01.07.2016 15:13

Если из полученного массива на клиент нужно передать только координаты, то тогда формируйте массив, а затем отдавайте го как JSON. Но естественно не таким образом как у вас в коде. Можно так:

echo json_encode(array_map(function($v) {
    return [$v['Latitude'], $v['Longitude']];
}, $result));


если $result, это есть исходный массив.

Если же на клиенте требуется все, то можно уже на клиенте из полученного объекта сформировать массив координат.

PS, если представленный код выводиться в индексном файле и в строку 58 и нужно вставить эти координаты, то можно так:

points = <?=json_encode(array_map(function($v) {
    return [$v['Latitude'], $v['Longitude']];
}, $result))?>

angelzzz 01.07.2016 15:22

Цитата:

Сообщение от laimas (Сообщение 421016)

PS, если представленный код выводиться в индексном файле и в строку 58 и нужно вставить эти координаты, то можно так:

points = <?=json_encode(array_map(function($v) {
    return [$v['Latitude'], $v['Longitude']];
}, $result))?>

php выполняется в одном файле getdata.php, а js и html находятся в другом index.html.

laimas 01.07.2016 15:32

Цитата:

Сообщение от angelzzz
php выполняется в одном файле getdata.php, а js и html находятся в другом index.html.


Поясните тогда - при запросе индексного файла getdata.php уже будет выполнен или нет?

Viral 01.07.2016 15:34

laimas, разве есть возможность в файл .html инклудить .php?

laimas 01.07.2016 15:37

Цитата:

Сообщение от Viral
разве есть возможность в файл .html инклудить .php?

Да без проблем.

Viral 01.07.2016 15:42

laimas, например?

laimas 01.07.2016 15:48

.htaccess

RemoveHandler .html .htm
AddType application/x-httpd-php .php .htm .html .phtml

<html>
......
<script>
var $points = <?php include 'getdata.php'?>
</script>
<script src="ymaps.js"></script>
....
</html>


в ymaps.js в строке 58 points = $points.

Можно и JS указать исполняемым, вывод его производить скриптом и подключения делать в нем.

Viral 01.07.2016 15:50

laimas, хитро, хитро

laimas 01.07.2016 15:54

Цитата:

Сообщение от Viral
хитро, хитро

Да все без хитрости, например роботы больше "любят" не

xxx.php?a=1&b=2...

а нечто читаемое/узнаваемое/12/и_ради_сео.html

а исполнятся будет php, asp, pl и т.п., в общем перенаправление.


Часовой пояс GMT +3, время: 08:28.