2011-09-15 9 views
1

ループを開始するPHPスクリプトにAJAXリクエストを行うjavascriptがあります。このループは、データをJavaScriptに返します。 PHPスクリプトの配列をjavascriptに送り返すことができますが、これは正しく動作していないようです。JSON経由のAJAXリクエストからPHP配列を取得するにはどうすればいいですか?

主に2つ(またはそれ以上)の配列を同時に返すことがあるためです。 これはどのように機能しますか? JSONのヘルプを検索しようとしましたが、私の問題を説明したものは見つかりませんでした。私のHTTPレスポンス方式で

if(http.readyState == 3) 
{ 

     console.log(http.responseText); 
     var toBeEvaled = "(" + http.responseText + ")"; 
     console.log(toBeEvaled); 
     var textout = eval(toBeEvaled); 

     console.log(textout.name); 

} 

私のPHPは次のよ​​うになります。

echo json_encode(array('type' => 1, 'name' => $stringVar, 'id' => $id)); 

ログ1は次のようになります。

{"type":1,"name":"String1","id":"1000004"} 
{"type":1,"name":"String2","id":"60220"} 

ご覧のとおり、2つの配列がありますその中に もう1つの問題は、新しい配列がhttp.responseTextに追加されるため、何らかの形で私がすでに処理したものを取り除き、まだ処理していない新しいものだけを処理できるようにする必要があるということです。

例、2のログを記録すると、次のようになります。

{"type":1,"name":"String1","id":"1000004"} 
{"type":1,"name":"String2","id":"60220"} 
{"type":1,"name":"String3","id":"5743636"} 
{"type":1,"name":"String4","id":"8555983"} 
{"type":1,"name":"String5","id":"7732"} 
{"type":1,"name":"String6","id":"92257"} 

任意のアイデア?

::::

解決済み!

echo json_encode(array('type' => 1, 'name' => $stringVar, 'id' => $id)) . '%#%'; 

お知らせ終わりには '%#の%':次..

PHPをしました。

Javascriptを:

var lastResponse = ''; 
function useHttpResponse() 
{ 

    if(http.readyState == 3) 
    { 

     // Get the original response before we edit it 
     var originalResponse = http.responseText; 
     // Replace the found last response in our original response with nothing(basically editing out the last response) 
     var newResponse = originalResponse.replace(lastResponse, ''); 
     // Add our new response to the last response 
     lastResponse += newResponse; 

     var responses = newResponse.split("%#%"); 
     $.each(responses, function(index, value){ 

       if(value != '') 
       { 

        var textout = eval('(' + value + ')'); 
        console.log('Name: ' + textout.name + ', ID: ' + textout.id); 

       } 

     }); 

    } 

} 

は素晴らしい仕事!あなたは2次元配列を持っているので、:)

答えて

0

は、それはさて、あなたは個々のJSONチャンクをエコーし​​ている

2

をJSON作る...他のアレイにあなたの配列を置きます。それがうまくいかない理由です。同じ出力で複数のjsonチャンクが有効でないため、jsonを解釈するものはすべてbarfになります。その代わりに、それらの配列を 'マスター'配列に追加し、スクリプトの最後に出力します。例えば、

$array = array(); 
while(loop) { 
    array_push($array, array('type' => 1, 'name' => $stringVar, 'id' => $id)); 
} 

echo json_encode($array); 
のような何かを与える必要があり

...

[ 
{"type":1,"name":"String1","id":"1000004"}, 
{"type":1,"name":"String2","id":"60220"}, 
{"type":1,"name":"String3","id":"5743636"}, 
{"type":1,"name":"String4","id":"8555983"}, 
{"type":1,"name":"String5","id":"7732"}, 
{"type":1,"name":"String6","id":"92257"} 
] 

+0

は、残念ながら、メインPHPループを実行するのに約7分かかり、私はそれを希望有効です7分後に1つの大きな「チャンク」の代わりにデータを連続的に返送すること。いずれにしても解決策はありますか? – Tanax

+1

残念ながら、データを継続的に返送したい場合は、おそらくjsonが行く方法ではありません。これは、私が知る限り、どのような種類の「進行中のストリーム」フォーマットも持たない、非常に構造化された設定です。 js(つまり、---- \ n $ jsondata \ n ----)を使用して読み込むことのできるカスタムフォーマットを使用する方がよい場合があります。最後の--- \ n(data)\ n ----)、各チャンクの内容をデコードします。それは意味をなさないでしょうか? – Stephen

+0

私はそれを解決しました! :)最初の投稿を編集して、悪い方法であればコメントしてください。しかし、それは完全に動作しています。 – Tanax

関連する問題