質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

1137閲覧

phpの配列をjavascriptで取得したい

ohayou

総合スコア18

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2018/12/19 01:02

jsonを使ってphp→javascriptの通信をしたのですが、どうも値がうまくわたってくれません。

php側を書き換えるのかjavascript側を書き換えるのかどちらかもわかりません。

別フォームで入力した緯度経度を[12.345, 23.456, 56.789]という風に取得したいのですがどうすればいいのでしょうか?

html

1<!DOCTYPE html> 2<html> 3<body> 4</body> 5<script type="text/javascript"> 6//マップ生成 7var map = L.map('map'); 8L.tileLayer('https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png', { 9 attribution: "<a href='https://maps.gsi.go.jp/development/ichiran.html' target='_blank'>地理院タイル</a>" 10}).addTo(map); 11map.setView([,], 12); 12 13</script> 14 15<?php 16//DB接続 17$pdo = new PDO($dsn, $user, $password); 18 19//データベースに値を挿入 20 $sql="INSERT INTO lnglat (name, comment, ido, keido) VALUES (:name, :comment, :ido, :keido)"; 21 $stmt = $pdo->prepare($sql); 22 $params = array(':name' => $name, ':comment' => $comment, ':ido' => $latitude, ':keido' => $longitude); 23 $stmt ->execute($params); 24 25//確認のため表示 26$sql = 'SELECT * FROM lnglat'; 27$result = $pdo->query($sql); 28foreach($result as $row){ 29 echo $row['id'].': '; 30 echo $row['comment'].' '; 31 echo $row['ido'].' '; 32 echo $row['keido'].'<><>'; 33//json形式に変換 34 $phpjson=json_encode($row['ido']); 35//全てきちんと表示された(緯度:12.1234,56.7890など) 36 echo $phpjson.'<br>'; 37} 38 39?> 40 41<script type="text/javascript"> 42 43var test=JSON.parse('<?php echo $phpjson; ?>') 44 45//配列をすべて取得したいが取得できるのは最新投稿の1文字ずつ 46//例えば緯度:12.345と投稿した場合取得されるのは[1,2,.,3,4,5]など 47//最新投稿の1文字ずつが取得される 48for(var i=0;i<test.length;i++){ 49 console.log(test[i]) 50} 51 52console.log("log出力"); 53console.log(test); 54</script> 55</html>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

配列をすべて取得したいが取得できるのは最新投稿の

最新投稿になるのは、m6u様のおっしゃる、上書きのせいです

$phpjson=json_encode($row['ido']);

のところを

$latitudes[] = $row['ido'];

として、foreachの閉じカッコのあとで、$phpjson = json_encode($latitudes);などとする必要があります。

例えば緯度:12.345と投稿した場合取得されるのは[1,2,.,3,4,5]など
最新投稿の1文字ずつが取得される

ここのところですが、実際に[1,2,.,3,4,5]となりますか?
console.log(test[i])の結果だと思うのですが

1
2
.
3
4
5
log出力

ではないですか?

おそらく、$row['ido']は"12.345"が数値か文字列で入っていると期待しますので、
$phpjson = json_encode("12.345");の結果、$phpjsonは"12.345"ですし、JSON.Parse($phpjson)も、12.345です。これをforで取り出すと↑のような結果となると想像します。

繰り返しになりますがforeachの中で$phpjsonを作ると、$row['ido']の単一の値だけが上書きになり、配列にならないので、こういう動きになります。

投稿2018/12/19 01:26

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ohayou

2018/12/19 04:40

ありがとうございます!解決できました!!
guest

0

あまり読まずに回答します。

php→javascriptの通信

そのまま受け取ると「できません。」
行われるのは通信ではないからです。
PHPが行っているのはあくまで画面への出力のみで、それをブラウザから参照するためにHTMLなりCSSなりJavaScriptなりに解釈してくれます。
つまり「ブラウザがHTMLなりCSSなりJavaScriptなりに解釈できるような文字列をPHPでechoすれば良い」という話になります。
またこれにより「JavaScriptで作った情報をPHPでそのまま参照は不可」ということにもなります(Ajax・非同期通信の場合は別)
強いてならブラウザ⇔サーバーの通信ですね。

今どのように出力されているか分かりませんが、「ブラウザがHTMLなりCSSなりJavaScriptなりに解釈できるような文字列をPHPでecho」するようにしてください。
[12.345, 23.456, 56.789]としたいのでしたらまずは

php

1echo "var test=JSON.parse('[12.345, 23.456, 56.789]');";

とするところからですね。
これで想定通り動いたらあとはこの形になるようにPHPで文字列を作っていきましょう。


以下、ヒント回答(もしかしたらそのまま答えかもしれませんが)

idoカラムがどのような形になっているか分からないですけど、
json_encode()自体がうまくいってないんじゃないかと。
本来はPHPの配列などをJSON文字列に変換するものです。
もしidoカラムに行毎に緯度情報が入っているのでしたら、
実はjson_encode()はおそらく想定通りになりません。
むしろjson_encode()は不要で下記のように書いたほうがいいのではないでしょうか。

php

1$ido_array = []; 2foreach($result as $row){ 3//中略 4 $ido_array[] = $row['ido']; 5//中略 6} 7//中略 8?> 9//中略 10var test=JSON.parse('[<?php echo implode(",",$ido_array) ?>]')

投稿2018/12/19 01:17

編集2018/12/19 01:18
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2018/12/19 01:32

ヒントのところですが、おっしゃる趣旨はそのとおりとは思いますが、JSON.parseでパースできる配列を作るのに、[]の文字とimplode結果を足すくらいなら、せっかく作った$ido_arrayをそのままjson_encodeにかけたほうがよいように思います(配列をjsonにするもの、という回答内容にも添うと思います)。
m.ts10806

2018/12/19 01:38

確かにその方が質問の流れには沿ってるように思いますし、私も「JSON文字列だけ出力する」のが目的であればjson_encode()使うと思います。 ただ、このようにした主旨としては、 私の回答が「ブラウザがHTMLなりCSSなりJavaScriptなりに解釈できるような文字列をPHPでechoする」なので、その方向性に沿って書いたものになります。 json_encode()だとどのような文字列になるのか最初はイメージしづらいところもあります。今後、json文字列以外も同じようにPHPで作ったものを出力することもあるでしょうし、その際に作り方のイメージがしやすいやり方ということでの提案としてみました。
papinianus

2018/12/19 02:15

コメントありがとうございます。理解しました。私が姑息な考えで羞じいるばかりです。
m.ts10806

2018/12/19 02:17

そこまで卑下しなくても・・・。 私も言葉足らずのところがあるのでそこは日々反省です。
guest

0

javascriptコード内に
echo $phpjson.'<br>';で」<br>とか置かれたら文法エラーでしょ。

しかも、

foreach($result as $row){ echo $row['id'].': '; echo $row['comment'].' '; echo $row['ido'].' '; echo $row['keido'].'<><>'; //json形式に変換 $phpjson=json_encode($row['ido']); //全てきちんと表示された(緯度:12.1234,56.7890など) echo $phpjson.'<br>'; }

foreachのループをするたびに、$phpjsonは追記ではなく上書きされているっていう。
せめて、配列に保存しておいてimplode()で連結してjsonに仕立てるとかしないと。

投稿2018/12/19 01:07

編集2018/12/19 01:10
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/12/19 01:20

超見づらいですが、<br>のechoはscript内ではないですね・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問