こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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>

投稿日時 - 2004-01-04 11:35:50

QNo.741779

すぐに回答ほしいです

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

>この問題を扱ってくれているものは、皆無か、
>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万行ですよね。もっと少ない
ファイルでテストしてみるとどうなりますか?

投稿日時 - 2004-01-07 14:58:05

お礼

>あと読み込むデータが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");
}
}

投稿日時 - 2004-01-19 11:14:09

ANo.7

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.6

jxt

エラーの内容もそうだけど、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";

こうしたりいろいろ工夫してみてください。

投稿日時 - 2004-01-06 17:31:03

補足

少し前進しましたが、ヘンです。同じデータを下のようにファイルに書いて読み込み、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>

投稿日時 - 2004-01-07 14:55:42

お礼

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

投稿日時 - 2004-01-06 18:17:44

ANo.5

jxt

そーすをそのままコピーされたんですね。
あのソースは見やすくするために全角スペースを入れてあったので
それを削ってやれば問題ないです。

途中ファイルから読み込むときに改行コードが邪魔だったので
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>

投稿日時 - 2004-01-06 16:45:00

お礼

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

投稿日時 - 2004-01-06 17:13:49

ANo.4

jxt

Parse error: parse error, unexpected '@' in C:\Apache2\htdocs\dic\php_jsEchangeTest.php on line 44

ってことは、php_jsEchangeTest.phpの44行目で
パースエラーを起こしてるって事です。

余分な@があるって事で、そこをダブルクオート(”)
しているようでしたらそれをシングルクオート(’)に
置き換えてみたらいかがでしょう。

読み込む文字列を代入する前にaddslashes()をしておく
ことも忘れずに。

ソースが見れれば良いんですけどねぇ。

投稿日時 - 2004-01-06 14:11:36

お礼

ソースの全体です。

<?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
とおこられます。
原因が分かりません。基本的な知識で大変申し訳ありませんが、どうかお教えください。

投稿日時 - 2004-01-06 16:28:15

ANo.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のエラーになりますので、"が含まれる可能性があるなら必要な処理を
ご自分で考えてみてくださいね。

投稿日時 - 2004-01-05 22:42:20

お礼

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

投稿日時 - 2004-01-05 23:09:47

ANo.2

jxt

スクリプトがよくわからないのですが、

$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;

って出ますけど、こんなことじゃなくて?

投稿日時 - 2004-01-05 15:31:46

お礼

ご回答ありがとうございました。その内容は、つまり、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
でした。
ひどく基本的なことをおたずねして、呆れていらっしゃるとは存じますが、どうぞ、もうすこしくわしくスクリプトを書いて頂けないでしょうか?

投稿日時 - 2004-01-05 20:18:48

ANo.1

jxt

よくある事例ですが、JavaScriptとPHPは動作する
「場所」が違います。

JavaScriptはHTMLの一部であり、クライアントサイドで
動作します。

PHPはサーバーサイドのスクリプトで、JavaScriptを含む
HTMLを出力します。

つまり、最終目的となるJavaScriptを思い描いて、
それが出力できるようにPHPを書いてあげればよい
ということです。

これさえ理解できれば難しいことではないはずです。

投稿日時 - 2004-01-05 11:31:00

お礼

はい、そこまでは理解できております。それなのに、その先へ行けないのです。初心者の悲しさです。
次のようなことも、さっきからやってみておりますが、値が渡されておりません。データは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;
}

投稿日時 - 2004-01-05 15:05:06

あなたにオススメの質問