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

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

PHP配列をJavaScriptに渡したい

全くの初心者です。 PHPファイルのなかで外部のテキストファイルから読み込んだデータ$listをJavaScriptの配列に変換したいのですが、分かりません。よろしくお願いします。 JavaScriptが外部のデータを読み込めないなら、いったんPHPでオプションメニューに書き込んだあと、これをJSで配列に取り込むことも考えたのですが、これもオプションメニューの各アイテムをどうしたら読み取れるのかが分かりませんのであきらめたしだいです。 <?php $file = fopen("GermJ.txt","r"); $list = file('GermJ.txt'); fclose($file);  $max=count($list); ?> <SCRIPT type="text/javascript"> <!-- var jsArray; // グローバル宣言 function Arraycreate() {  jsArray = new Array($max);  //$max をこうすることは可能ですか?  for (i = 0; i <= $max-1; i++) { jsArray = $list[i];???????? (分かりません) } } // --> </SCRIPT>

  • PHP
  • 回答数7
  • ありがとう数9

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

  • ベストアンサー
  • 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

  • PHP配列をJavaScriptに渡したい(再)

    済みません。まだ成功しておりませんので、引き続きご教授をお願いいたします。 4万行になるGermJ.txt というファイルを4000行に削ると、成功しましたが、それ以上の行数だと画面が真っ白になったり、ハング状態になりました。 もう後一歩なのですが、どうか、よろしくご指導ください。 function getArray() { <?php $file = fopen("GermJ.txt","r"); $phparray = file('GermJ.txt'); fclose($file); $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"); } }

    • ベストアンサー
    • PHP
  • PHPの配列をjavascriptへ渡したい

    PHPの配列をjavascriptの配列に渡したいのですがやり方がわかりません。 変数の渡し方ならわかるのですが配列はどう渡せばいいのでしょうか? for文を使って渡せばいいと思うんですがどうやればいいか分かりません。 <?php $filedata=file("data.txt");//javascriptに渡したい配列 ?> <script language="javascript"> var a=new Array();//PHPの配列をこの配列に入れたい </script> 何方か教えてください。

    • ベストアンサー
    • PHP
  • 配列をオプションメニューに書き込むには?

    PHPを始めたばかりです。HTMLスクリプトの中に埋め込めるのがPHPの特徴だ、 と本に書かれていますが、次のようにオプションメニューリストを書こうとする時は、どうしたらよいのでしょうか。JavaScript との連携も考えないと不可能のように思えるのですが、いかがなのでしょうか?どなたか、どうかよろしく御教示下さい。 (辞書の見出し語配列 $wordlist は、この同じプログラムファイル内の別の場所で、PHPをつかって辞書ファイルを読んで取得されているものとします。グローバル変数です) <SELECT size="15" name="wordlist"> for ($i = 0; $i <= $max-1; $i++) //オプションメニューに記入する { for ($i=0; $i<=$#wordlist; $i++) { print "<option value=$wordlist[$i]>$wordlist[$i]></option>\n"; } } </SELECT>

    • ベストアンサー
    • PHP
  • 連想配列(PHP 対 JavaScript)

    こんにちは。質問をさせてください。 PHPでOracleのデータを取得してそのデータを連想配列に格納するとします。 /------- PHP内でのソース -----------------/ (例) $Count:検索データ数  for($cnt=0;$cnt<$Count;$cnt++){ $data[$cnt] = "取得したデータ";  Fech(次のレコードを取得する); } 上記で取得した連想配列の値をJavaScriptでしようしたいのですが うまくいきません。 JavaScriptではArrayに取得したデータを格納したいのです。 (例) /-- JavaScript内のソース Afor2=new Array("取得data1","取得data2",・・・"最後の取得data"); としてHTMLの何かのイベント時にしようしたいと考えています。 今僕は以下のような動きをしたいです。 /----以下、JavaScriptでの記述-----------------/ var New_Array=new Array(5); for(i=0;i<<?=$Count?>;i++){ document.form.cmb_box.options[i] = new Option(<?=$data[i]?>, i); } のようなことをしたいのですが。 (もちろん上記はだめですが・・・) 質問がわかりにくくて大変もうしわけありませんが、 アドバイス、質問などよろしくお願いいたします。

    • 締切済み
    • PHP
  • javascriptの配列をPHPで読み込みたいのですが・・・

    javascriptの配列を記述してあるファイル info.js があるとします data = new array(); data[0] = new array("data1","data2","data3"); data[1] = new array("data1","data2","data3"); data[2] = new array("data1","data2","data3"); ・ ・ ・ 上記の文で書かれた配列データを、PHP上で読み込み、新着一覧のような形でhtmlで表示したいのですが、方法が分かりません。 分かる方がいらっしゃいましたら教えて下さい。

    • ベストアンサー
    • PHP
  • PHPとJavascriptの連携

    こんにちは。 PHPとJavascriptの連携について質問があります。 ↓のコードは、 (1)PHPの側で、test.csvというCSVファイルからデータを配列に読み込み、 (2)その配列データをJavascriptに渡し、 (3)カウンター番号の配列データをHTMLのTextに表示させる という流れを意図したものです。 しかし、$question[]配列がJavascriptにうまくわたっていないようで、エラーになります。 発想自体に問題があるのか、表現の仕方がまずいのか、ご指摘いただきたくよろしくお願い申し上げます。 *************************************↓コード <script language="Javascript"> var $question = new Array(); var n = 0; function disp() { document.myform.mytext.value = $question[n]; //Textに$question[n]を表示させる n++; } </script> //------------------------------------------------------------------------ <form name="myform" > <input name="mytext" type="text"><br> <input name="mybutton" type="button" value="click" onclick="disp(this)"> </form> //------------------------------------------------------------------------ <?php $fp = fopen("test.csv", "r"); //CSVファイルを開く $count = 0;           //カウンターを初期化する while(!(feof($fp)))       //ファイルの終端まで読み込む { $buf = fgets($fp, 1024); $buf = chop($buf); //文末にある改行文字を削除する $data = split(",", $buf); // , ごとに区切って配列に格納する $question[$count] = $data[0]; //question[]配列に$data[0]を格納する $answer[$count] = $data[1]; //answer[]配列に$data[1]を格納する $count++; //カウンターを1進める } fclose($fp); ?>

    • ベストアンサー
    • PHP
  • PHP二次元配列をJavaScript配列へ変換

    PHPの二次元配列データを、JavaScriptの二次元配列データとして使用したいのですが、どうやって変換すればよいでしょうか?

    • ベストアンサー
    • PHP
  • javascript php 連携

    よろしくお願いします。 javascriptの『onchange』値をPHPの変数に入れたいと苦戦しています。 <html> <head> <script type="text/javascript"> function hoge1(){ var x = $('str1').options[$('str1').selectedIndex].text; やりたいことはここでPHPの変数『list_a』にjavascriptの変数『x』の値を入れたいです。 } </script> </head> <body> ここに結果表示 <?= $list_a; ?> <select id="str1" name="str1" onchange="hoge1()"> <option>hoge1</option> <option>hoge2</option> <option>hoge3</option> </select> </body> </html> よろしくお願いいたします。 ちなみにAjaxは全くわかりませんのですいません。。。

    • ベストアンサー
    • PHP
  • javascriptのPHP化について

    宜しくお願い致します。 javascriptの外部ファイルをPHP化して、サーバサイドで動的に生成した内容を吐き出し、それをHTML側でjavascriptの外部ファイルとして受け取って処理しております。 この場合のブラウザがアクセスした際に処理される順番は・・・ (1)HTMLの読み込み開始 (2)header内のjavascript外部ファイルの読み込みと実行 (3)HTMLファイルのbody以下を読み込み (4)結果をブラウザに返して表示 という流れになるはずです。 この場合、(2)のjavascript外部ファイルの方がbodyより先に実行されるはずです。 しかし、javascript外部ファイル内のPHPでセッションデータを扱っている場合、(3)のbody内でPHPでセッションを定義した内容が、なぜか(2)のjavascript外部ファイルで反映されて実行されるのです。 私のイメージでは・・・ (1)HTMLの読み込み開始 (2)header内のjavascript外部ファイルの読み込みと実行  ※この時セッションは反映しない (3)HTMLファイルのbody以下を読み込み  ※この時にセッションを入れても(2)が既に実行さられているので反映しない (4)結果をブラウザに返して表示  ※結果、セッションにデータが入っておらず、php側でエラーを吐き出しjavascriptが止まる という様になるかと思ってましたが、なぜか実行されます。 javascriptはHTMLが全部読み込まれてから実行されるのでしょうか?

  • PHPとJavascriptの連携について

    PHP・Javascriptの初心者です。 PHPで設定された、配列のデータをJavascriptで作成した関数の渡したいのですが どうすればいいのでしょうか? 以下にサンプルを作成したのですが PHPで設定した、配列 $name が Javascriptに渡せません。 何が悪いのですか? 教えてください。 よろしくお願いします。 -sample.php- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <!-- CSS: implied media="all" --> <link type="text/css" rel="stylesheet" href="css/websyslogin.css" /> <!-- JavaScript loading --> <script src="js/websysdebug.js"></script> <script type="text/javascript"> function sysdebug( ss ){ alert( "Login -> "+ss ); } </script> <!-- タイトル --> <title>Vware Web System(PHP) </title> </head> <body> <?php $name = array(); $name[0] = "ABC"; $name[1] = "BCA"; ?> <input type="button" value="TEST" name="debug" id="debug" onclick="sysdebug(' <?php print $name[0]; ?> ');" /> <script type="text/javascript"> for( i=0;i< 2;i++ ) { ss = ' <?php print $name['+i+']; ?> '; alert( ss ); } </script> </body> </html>

    • ベストアンサー
    • PHP

専門家に質問してみよう