2012-01-16 8 views
3

を使用する場合、私は、サーバーに配列を渡すJSON.stringify方法を使用。不要な配列のインデックスJSON.stringify

arr[10] = 1; 
arr[20] = 1; 
arr[30] = 1; 
arr[40] = 1; 

それから私はこれを行う:

   jQuery.ajax({ 
        type: "post", 
        url: baseurl+"profile/mprofile/action/ratings/add_ratings", 
        data:{"checkbox":checkbox,"review":review,"speciality":speciality,"arr":arr}, 
        success: function(data, status) { 

         jQuery('#header-error').html(data); 
        } 
       }); 

私は取得しています:

arr = JSON.stringify(arr); 

が次にサーバーに送信

私は4つの要素を持つ配列を持っていますPHPの配列:

$arr = $this->ci->input->post('arr'); 
    $arr = json_decode($arr); 
    print_r($arr) ; die ; 

結果が

Array 
(
    [0] => 
    [1] => 
    [2] => 
    [3] => 
    [4] => 
    [5] => 
    [6] => 
    [7] => 
    [8] => 
    [9] => 
    [10] => 1 
    [11] => 
    [12] => 
    [13] => 
    [14] => 
    [15] => 
    [16] => 
    [17] => 
    [18] => 
    [19] => 
    [20] => 1 
    [21] => 
    [22] => 
    [23] => 
    [24] => 
    [25] => 
    [26] => 
    [27] => 
    [28] => 
    [29] => 
    [30] => 1 
    [31] => 
    [32] => 
    [33] => 
    [34] => 
    [35] => 
    [36] => 
    [37] => 
    [38] => 
    [39] => 
    [40] => 1 
) 

ですが、なぜでしょう?ありますか

答えて

5

これはjavascript配列の仕組みです。範囲外のインデックスに値を設定すると、配列が展開され、値は正常に設定され、すべての「不足」値はundefinedに設定されます。

あなたは(PHPの話で、または「連想配列」)の配列や辞書の違いをブレンドPHPの振る舞いによって台無しにされています。

だけのjavascriptの代わりに、配列内の辞書を作成し、この動作を回避するために。

var arr = {}; 
arr[10] = 1; 
arr[20] = 2; 

また、PHP側で、あなたはjson_decodeの2番目のパラメータとしてtrueを渡す必要があります。

json_decode($arr, true) 

これにより、stdclassではなく配列が返されます。

+1

+1、php側に追加することもできますが、json_decodeの2番目のパラメータをtrueに設定する必要があります。そうしないと、配列ではなくstdclassオブジェクトになります。 – Yoshi

+0

@ Yoshi:ありがとうございました。 –

+0

ありがとうございました..........:D:D –

1

arrをどのように初期化しますか?おそらく、配列の代わりにオブジェクトを使用したいと思うでしょう。例:

var arr = {}; 
arr[10] = 1; 
arr[20] = 1; 
arr[30] = 1; 
arr[30] = 1; 
var jsonified = JSON.stringify(arr); 
console.log(jsonified); 
1

JavaScriptの配列は、PHPと少し違って動作します。あなたは実際には4つの要素を持つ配列を持っていません。の最初の要素はです。たとえば、arr[ 10 ] = 1と言うと、0と9の間のすべての配列要素には自動的にundefinedが割り当てられます。

私はあなたの周りのロジックを切り替える勧め:

arr = [ 10, 20, 30, 40 ]; 

それとも、あなたはバイナリ値以外の必要がある場合は、オブジェクトを使用します:代わりに値を追跡するために、配列のキーを使用しての使用配列値を代わりに

arr = [ 
    { score: 10, value: 1 }, 
    { score: 20, value: 5 } 
]; 
関連する問題