• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHP配列をJavaScriptに渡したい)

PHP配列をJavaScriptに渡す方法とは?

このQ&Aのポイント
  • PHPファイルから外部のテキストファイルを読み込んで取得したデータをJavaScriptの配列に変換する方法が分からない初心者です。
  • JavaScriptが外部のデータを読み込めない場合、一度PHPでオプションメニューに書き込んでからJavaScriptで配列に取り込む方法も考えましたが、実装方法が分からなくて断念しています。
  • ご教示いただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • jxt
  • ベストアンサー率48% (42/86)
回答No.7

>この問題を扱ってくれているものは、皆無か、 >http://www.comtechware.com/phpSamples/showDetails.php?refNrVal=15 >に見られるような例では、値の引き渡しは行われていません。 なぜならば最初にも書いたとおり、PHPとJavaScriptは 動作する場所すら異なっているので、同じプログラミング言語 といえど「引き渡し」や「連携」させるのは不可能だから です。 一見「引き渡し」たり「連携」させているように見える 先のサンプルコードでさえPHPから見ればあくまで JavaScriptの一連のコードを「はき出している」に すぎないのです。 もうPHPでJavaScriptをはき出す部分まで出来ているので 残るはJavaScriptのエラーだけですよね。JavaScript でエラーが出ると言うことは「吐き出すコード」が 間違ってるってことです。そこを正しいコードが吐き出せる ようにPHPのprint文なりecho文などを変更するだけだと 思うんですが、どうも「引き渡し」や「PHPで全て解決」 と思いこみを持たれていて、HTMLのソースを確認する という簡単かつ重要なステップさえも見落とされている ようです。 PHPで吐き出された(JavaScriptでエラーが出るという) コードをきちんと読んでみてはいかがでしょう。 あと読み込むデータが4万行ですよね。もっと少ない ファイルでテストしてみるとどうなりますか?

tonka729
質問者

お礼

>あと読み込むデータが4万行ですよね。もっと少ないファイルでテストしてみるとどうなりますか? 何度もご指導頂いてほんとうに感謝しております。 ファイルを8000行にまで削ってやりますと、IEの実行速度がダウンするから、このスクリプトの実行を中止しますか?と言うメッセージが出て、16000行ファイルでphp->js変換するともう画面が真っ白で、しばらく停止状態でした。 4000行ファイルではおかげさまでスムーズに変換できました。この先どうしたら4万行ファイルから変換ができるようになるのでしょうか?どうか引き続き御教示をお願いいたします。 function getArray() { <?php $file = fopen("GermJ.txt","r"); $phparray = file('GermJ.txt'); fclose($file); /* $phparray[0]='aaaaaaa[aaa/aaaaaaaaa'; $phparray[1]='bbbbbbbbb\bbbbbbbbbb'; $phparray[2]='cccccc[bisk'vi: t]ccccccccccccc'; $phparray[3]='ddddddddddddddddddd'; $phparray[4]='eeeeeeeeeeeeeeeeeee'; */ $max = count($phparray); for ($i=0; $i<$max; $i++) { echo 'jsArray[' . ($i) . ']="' . ereg_replace("\r\n","",addslashes($phparray[$i])) . '";' . "\n"; } ?> for(i=0;i<jsArray.length;i++) { document.writeln(jsArray[i]+"<br>\n"); } }

その他の回答 (6)

  • jxt
  • ベストアンサー率48% (42/86)
回答No.6

エラーの内容もそうだけど、PHPの場合ははき出される テキスト(HTML)も重要だったり。。。 そこまでくれば後はファイルの中身に合わせて addslashesなりereg_replaceなりで文字列を エスケープしてやるだけですよ。 \r\nを消したのは改行コードを消しただけなので、 テキストの中の\nは消えてないはずです。 echo 'datalist[' . ($i+1) . ']="' . ereg_replace("\r\n","",$list[$i]) . '";' . "\n"; ここを echo 'datalist[' . ($i+1) . ']="' . ereg_replace("\r\n","",addslashes($list[$i])) . '";' . "\n"; こうしたりいろいろ工夫してみてください。

tonka729
質問者

お礼

ありがとうございました。 行:3293 エラー:終了していない文字列型の定数です。 というJSのエラーが出ました。 何度もご回答ありがとうございました。結局、php→ JS 配列の引き渡し、これは私の力では難しすぎるようです。 何かこれを解説してくれている書籍とか、サイトがありましたらお教えくださると、そちらでもっと勉強してから、ここへ再び参ることができるかもしれません・・・(すでに解説書は3冊読みましたし、レファランスも見たり、サイトのマニュアルなど、可能な限り当たってきましたが) この問題を扱ってくれているものは、皆無か、 http://www.comtechware.com/phpSamples/showDetails.php?refNrVal=15 に見られるような例では、値の引き渡しは行われていません。  どうかよろしくお願いします。

tonka729
質問者

補足

少し前進しましたが、ヘンです。同じデータを下のようにファイルに書いて読み込み、jsArray生成をしようとすると、 「終了していない文字列型の定数です」 というエラーが出ます。  ところがファイルをやめて、このスクリプト中で$list配列に同じデータをセットすると生成ができました。なぜでしょうか? function getArray() { var jsArray = new Array(); <?php $file = fopen("abc.txt","r"); $list = file('abc.txt'); fclose($file); $max = count($list); /* $list[0]='aaaaaaaaaaaaaaaaaaaaaaaaaa'; $list[1]='bbbbbbbbbbbbbbbbbbbbbbbbbb'; $list[2]='cccccccccccccccccccccccc'; $list[3]='ddddddddddddddddddddddddddd'; $list[4]='eeeeeeeeeeeeeeeeeeeeeeeee'; */ for($i=0;$i<count($list);$i++) { echo "jsArray[$i] = \"".addslashes($list[$i])."\";"; } ?> for (aa=0; aa<5; aa++) { document.write(jsArray[aa]+"<BR>"); } } //End of Function // --></SCRIPT>

  • jxt
  • ベストアンサー率48% (42/86)
回答No.5

そーすをそのままコピーされたんですね。 あのソースは見やすくするために全角スペースを入れてあったので それを削ってやれば問題ないです。 途中ファイルから読み込むときに改行コードが邪魔だったので ereg_replaceかましてみました。 <?php $file = fopen("GermJ.txt","r"); $list = file('GermJ.txt'); fclose($file); $max = count($list); ?> <HTML> <HEAD> <META http-equiv="Content-Style-Type" content="text/css"> <SCRIPT type="text/javascript"> <!-- var datalist; var imax; function getArray() { aa=-1; datalist = new Array(); <?php for($i=0;$i<count($list);$i++) { echo 'datalist[' . ($i+1) . ']="' . ereg_replace("\r\n","",$list[$i]) . '";' . "\n"; } ?> } //End of Function // --></SCRIPT> </HEAD> <BODY bgcolor="#edd596"> <script type="text/javascript"> <!-- aa=getArray(); // --> </script> </BODY> </HTML>

tonka729
質問者

お礼

php のParse エラーの代りにこんどはJSの、でたらめな行数(99)を言ってくるランタイムエラー「','」がありません、と出ますが。。もしかするとデータの文字列に問題が? 例えば継ぎのような一行です: fuchsen /// [口] \n(I)t.激しく怒らせる \n(II)refl. sich ueber etw fuchsen 或事に激しく腹を立てる こんなデータが4万件あります。でここの\nを消しちゃうということなんですね? でも、どうしてエラーが?

  • jxt
  • ベストアンサー率48% (42/86)
回答No.4

Parse error: parse error, unexpected '@' in C:\Apache2\htdocs\dic\php_jsEchangeTest.php on line 44 ってことは、php_jsEchangeTest.phpの44行目で パースエラーを起こしてるって事です。 余分な@があるって事で、そこをダブルクオート(”) しているようでしたらそれをシングルクオート(’)に 置き換えてみたらいかがでしょう。 読み込む文字列を代入する前にaddslashes()をしておく ことも忘れずに。 ソースが見れれば良いんですけどねぇ。

tonka729
質問者

お礼

ソースの全体です。 <?php $file = fopen("GermJ.txt","r"); $list = file('GermJ.txt'); fclose($file); $max = count($list); for ($i = 0; $i <= $max-1; $i++) { $s = $list[$i]; $pp = strpos($s, ' /// '); if ($pp>0) { $stichwort = substr($s,0,$pp+1); $yakugo = substr($s, $pp + 6); $dic_hash[$stichwort] = $yakugo; } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <META name="GENERATOR" content="IBM WebSphere Studio Homepage Builder Version 7.0.0.0 for Windows"> <META http-equiv="Content-Style-Type" content="text/css"> <META name="IBM:HPB-Input-Mode" content="mode/flm; pagewidth=940; pageheight=1200"> <TITLE></TITLE> <SCRIPT type="text/javascript"> <!-- var datalist; var imax; function getArray() { aa=-1; datalist = new Array(); <?php for($i=0;$i<count($list);$i++) //************* {  echo 'datalist[' . ($i+1) . ']=' . $list[$i] . ';'; } ?> } //End of Function // --></SCRIPT> </HEAD> <BODY bgcolor="#edd596"> <script type="text/javascript"> <!-- aa=getArray(); // --> </script> </BODY> </HTML> このスクリプトの//**********のところを行数で指し示して: Parse error: parse error, unexpected '@' in C:\Apache2\htdocs\dic\kdic2.php on line 51 とおこられます。 原因が分かりません。基本的な知識で大変申し訳ありませんが、どうかお教えください。

  • kirin_f
  • ベストアンサー率51% (44/85)
回答No.3

なんだかJavaScriptとPHPがごっちゃになっていますね。 <SCRIPT type="text/javascript"> <!-- var jsArray; // グローバル宣言 function Arraycreate() {  jsArray = new Array( <? $list = file('GermJ.txt'); for($i = 0 ; $i < count($list) ; $i++){ print "\"" . trim($list[$i]) . "\""; if($i != (count($list)-1)){ print ",\n"; } } ?>  ); } // --> </SCRIPT> とりあえず、こんな感じでどうでしょう? ただし、GermJ.txtの中のテキストに"があると JavaScriptのエラーになりますので、"が含まれる可能性があるなら必要な処理を ご自分で考えてみてくださいね。

tonka729
質問者

お礼

私のおたずねしている枠組みに沿って御回答していただき大変ありがとうございました。 エラーが出ました。これで配列jsArray に値が代入されたことになるのですか?

  • jxt
  • ベストアンサー率48% (42/86)
回答No.2

スクリプトがよくわからないのですが、 $array = array('data1','data2','data3'); for ($i=0;$i<count($array);$i++;) {  echo 'js_array[' . ($i+1) . '] = ' . $array[$i] . ';'; } これで js_array[1] = data1; js_array[2] = data2; js_array[3] = data3; って出ますけど、こんなことじゃなくて?

tonka729
質問者

お礼

ご回答ありがとうございました。その内容は、つまり、phpの配列 $list をこのようにjsArrayへと変換できるということですね? 最初に私が書きましたあのスクリプトがいたらないために、おわかりにならない、とのこと。申し訳ありません。 このphp_Js_Exchange.php というファイルをことばで説明いたします。まず最初の所は外にあるテキストファイル(4メガ)をphp配列に読み込みます。次のJS スクリプトの部分で、この配列 $list から値をfor 文でJSの配列 jsArray を生成して代入しようとしています。 この部分に、今教えて頂いた4行のスクリプトを入れてみたのですが、 最初のParseエラーは:) があるべきところに ; がある、という内容でした。 これを for ($i=0;$i<count($array);$i++) {  echo 'js_array[' . ($i+1) . '] = ' . $array[$i] . ';'; } としたところ こんどのParseエラーは Parse error: parse error, unexpected '@' in C:\Apache2\htdocs\dic\php_jsEchangeTest.php on line 44 でした。 ひどく基本的なことをおたずねして、呆れていらっしゃるとは存じますが、どうぞ、もうすこしくわしくスクリプトを書いて頂けないでしょうか?

  • jxt
  • ベストアンサー率48% (42/86)
回答No.1

よくある事例ですが、JavaScriptとPHPは動作する 「場所」が違います。 JavaScriptはHTMLの一部であり、クライアントサイドで 動作します。 PHPはサーバーサイドのスクリプトで、JavaScriptを含む HTMLを出力します。 つまり、最終目的となるJavaScriptを思い描いて、 それが出力できるようにPHPを書いてあげればよい ということです。 これさえ理解できれば難しいことではないはずです。

tonka729
質問者

お礼

はい、そこまでは理解できております。それなのに、その先へ行けないのです。初心者の悲しさです。 次のようなことも、さっきからやってみておりますが、値が渡されておりません。データは5万件以上です。 <SCRIPT type="text/javascript"> <!-- var datalist; var imax; function getArray() { aa=-1; datalist = new Array(); <? for ($ii=0; $ii<$max; $ii++) { ?> aa++; datalist[aa]= <?$list[$ii] ;?> <? } ?> imax = datalist.length; }

関連するQ&A