Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Подмена значений в JSON массиве из PHP-массива. (https://javascript.ru/forum/server/55834-podmena-znachenijj-v-json-massive-iz-php-massiva.html)

tabarigen 16.05.2015 15:19

Подмена значений в JSON массиве из PHP-массива.
 
Ребят чувствую только тут мне смогут помочь.

Предыстория тут.

А если кратко, тянем данные из 1с, и визуализируем с помощью amcharts.com.

Данные вытянул, теперь осталось их подсунуть в отчет.

Есть массив на PHP со значениями которые я хочу передать в отчет.
object(stdClass)#52 (1) { ["return"]=> object(stdClass)#62 (1) { ["strokaOtcheta"]=> array(4) { [0]=> object(stdClass)#88 (3) { ["doxod"]=> float(28184501.42) ["razxod"]=> float(26703754.53) ["podrazdelenie"]=> string(22) "Первое значение" } [1]=> object(stdClass)#89 (3) { ["doxod"]=> float(0) ["razxod"]=> float(6331.71) ["podrazdelenie"]=> string(10) "Второе значение" } [2]=> object(stdClass)#90 (3) { ["doxod"]=> float(28633237.75) ["razxod"]=> float(27051062.18) ["podrazdelenie"]=> string(22) "Третье значение" } [3]=> object(stdClass)#91 (3) { ["doxod"]=> float(23287488.7) ["razxod"]=> float(21948158.41) ["podrazdelenie"]=> string(16) "Четвертое значение" } } } } // Подключаем js-скрипты для отчетов



И есть сам отчет который оформлен в js.
<!-- amCharts javascript code -->
		<script type="text/javascript">
			AmCharts.makeChart("chartdiv",
				{
					"type": "serial",
					"path": "http://www.amcharts.com/lib/3/",
					"categoryField": "category",
					"maxSelectedTime": -2,
					"startDuration": 1,
					"decimalSeparator": ",",
					"categoryAxis": {
						"gridPosition": "start",
						"position": "top",
						"title": "Аналитический отчет",
						"titleColor": "#000000",
						"titleFontSize": 15
					},
					"trendLines": [],
					"graphs": [
						{
							"colorField": "color",
							"fillAlphas": 1,
							"id": "AmGraph-1",
							"lineColorField": "color",
							"title": "graph 1",
							"type": "column",
							"valueField": "column-1"
						}
					],
					"guides": [],
					"valueAxes": [
						{
							"id": "ValueAxis-1",
							"maximum": 30000000,
							"minimum": 1,
							"axisThickness": 0,
							"color": "#4B0082",
							"fontSize": 13,
							"gridThickness": 0,
							"labelRotation": -3.6,
							"minHorizontalGap": 73,
							"showFirstLabel": false,
							"showLastLabel": false,
							"tickLength": 3,
							"title": "Руб. ",
							"titleBold": false,
							"titleFontSize": 1
						}
					],
					"allLabels": [],
					"balloon": {},
					"titles": [],
					"dataProvider": [
						{
							"category": "Первое значение",
							"column-1": "78787878",
							"color": "#DCD36A"
						},
						{
							"category": "Второе значение",
							"column-1": "78787878",
							"color": "#EE204D"
						},
						{
							"category": "Третье значение",
							"color": "#77DD77",
							"column-1": "78787878"
						}
					]
				}
			);
		</script>


Так как вся соль в автоматическом обновлении данных в отчете.
Как бысделать так чтоб в скрипт отчета подставлялись данные из PHP массива с необходимыми значениями.

Правильно ли я понимаю, что нужно исходные данные в JSON преобразовать?

tabarigen 16.05.2015 15:24

Конкретно нужно
["doxod"]=> float(23287488.7) подставить в "column-1": "78787878"

Aetae 17.05.2015 01:52

Судя по докам делать надо так:
var data = [
                        {
                            "category": "Первое значение",
                            "column-1": "78787878",
                            "color": "#DCD36A"
                        },
                        {
                            "category": "Второе значение",
                            "column-1": "78787878",
                            "color": "#EE204D"
                        },
                        {
                            "category": "Третье значение",
                            "color": "#77DD77",
                            "column-1": "78787878"
                        }
                    ];

var chart =  AmCharts.makeChart("chartdiv",
                {
                    "type": "serial",
                    "path": "http://www.amcharts.com/lib/3/",
                    "categoryField": "category",
                    "maxSelectedTime": -2,
                    "startDuration": 1,
                    "decimalSeparator": ",",
                    "categoryAxis": {
                        "gridPosition": "start",
                        "position": "top",
                        "title": "Аналитический отчет",
                        "titleColor": "#000000",
                        "titleFontSize": 15
                    },
                    "trendLines": [],
                    "graphs": [
                        {
                            "colorField": "color",
                            "fillAlphas": 1,
                            "id": "AmGraph-1",
                            "lineColorField": "color",
                            "title": "graph 1",
                            "type": "column",
                            "valueField": "column-1"
                        }
                    ],
                    "guides": [],
                    "valueAxes": [
                        {
                            "id": "ValueAxis-1",
                            "maximum": 30000000,
                            "minimum": 1,
                            "axisThickness": 0,
                            "color": "#4B0082",
                            "fontSize": 13,
                            "gridThickness": 0,
                            "labelRotation": -3.6,
                            "minHorizontalGap": 73,
                            "showFirstLabel": false,
                            "showLastLabel": false,
                            "tickLength": 3,
                            "title": "Руб. ",
                            "titleBold": false,
                            "titleFontSize": 1
                        }
                    ],
                    "allLabels": [],
                    "balloon": {},
                    "titles": [],
                    "dataProvider": data
                }
            );


//после получения новых жанных из php делать следующее:
data[0]['column-1'] = новые_цифры;
chart.validateData();

igormog 17.05.2015 13:29

Возьмите массив из JS, потом преобразуйте помощью json_decode, далее работаете как с обычными массивами в PHP, после замены, преобразуете опять в JSON для JS

tabarigen 19.05.2015 08:47

Цитата:

Сообщение от Aetae (Сообщение 371201)
Судя по докам делать надо так:
var data = [
                        {
                            "category": "Первое значение",
                            "column-1": "78787878",
                            "color": "#DCD36A"
                        },
                        {
                            "category": "Второе значение",
                            "column-1": "78787878",
                            "color": "#EE204D"
                        },
                        {
                            "category": "Третье значение",
                            "color": "#77DD77",
                            "column-1": "78787878"
                        }
                    ];

Чтоб такой массив получить понадобится JSON_ENCODE()???

tabarigen 19.05.2015 09:31

Массив значений я получаю,
$result = $client->PoschitatDoxod($params)->return->strokaOtcheta;
foreach ( $result as $key)
  $json_data[] = array("column-1"=>"$key->doxod","color"=>"#DCD36A","category"=>"$key->podrazdelenie"); 
  $table_json['data'] = $json_data; 
   //echo json_encode($table_json, JSON_UNESCAPED_UNICODE);


Как теперь сделать так чтоб он был доступен в var data??

tabarigen 19.05.2015 09:59

Пробую так, но выскакивает ошибка
$result = $client->PoschitatDoxod($params)->return->strokaOtcheta;
foreach ( $result as $key)
  $json_data[] = array("column-1"=>"$key->doxod","color"=>"#DCD36A","category"=>"$key->podrazdelenie"); 
  $table_json['data'] = $json_data; 
   echo json_encode($json_data, JSON_UNESCAPED_UNICODE);
   <script language="javascript"> 
	var data=<?php echo json_encode($json_data, JSON_UNESCAPED_UNICODE); ?>; 
	</script>
?>


Цитата:

Parse error: syntax error, unexpected '<' in C:\xampp\htdocs\charts\wsclient.php on line 24

tabarigen 19.05.2015 10:13

Упс... Ссори.
Надо было скрипт вынести за тег <?php ?>.

Всем спасибо большое. Теперь осталось решить следующее.
У меня в массив в значение color выводятся предопределенные значения которые я указал. Соответственно и диаграмма выводит три колонки одинакового цвета, что не совсем эстетично. Как я могу в color передавать различные предопределенные значения??

kostyanet 28.05.2015 06:51

Цитата:

Сообщение от tabarigen
"$key->doxod"

Не надо такого извращения. И еще несколько перверсий было бы неплохо выпрямить.

Еще раз глянул, в общем там бред голимый.

Цвет надо генерить в зависимости от номера колонки. У вас номеров нет, все валится сплошняком в один массив, причем в другой все валится еще раз и каждый раз еще больше к тому что уже было, а потом оно зачем-то вываливается в буфер... галиматья, короче.

Из бредокода вроде ясно что надо отгрузить $result и париться уже в браузере. Там же и цвет нагенерить, какая разница-то, если по нему нет данных в результе.

json_encode() и объекты захавает, не волнуйтесь.

ЗЫ Ну да, а потом просто obj.dataProvider = JSON.parse(this.responseText) или типа того.


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