2012-05-12 17 views
2

私は以下の多次元javascript配列を持っています。PHPで多次元配列をMysqlデータで構築する

var accounts = 
    [ 
     { name: '069070474', crd_no: 
     [ 
      {name: '0215020174357351', ssn_no: ['582238797'] } 
     ]}, 
     { name: '089255135', crd_no: 
     [ 
      {name: '0215020178346863', ssn_no: ['583872782','874514213']} 
     ]}, 
     { name: '123456789', crd_no: 
     [ 
      {name: '8888888888888888', ssn_no: ['122121212']} 
     ]}, 
     { name: '131274740', crd_no: 
     [ 
      {name: '0215020178888432', ssn_no: ['478498545','584586942']} 
     ]}, 
     { name: '454296191', crd_no: 
     [ 
      {name: '0215020178896484', ssn_no: ['582214564']} 
     ]}, 
     { name: '987654321', crd_no: 
     [ 
      {name: '8888888888888888', ssn_no: ['122121212']} 
     ]} 
    ]; 

そして私はまた、次のスキーマを使用してMySQLテーブルの上のデータを持っている:

TABLE `profile_id` 
(
`acct_no` varchar(19) NOT NULL COMMENT 'Customer account no', 
`crd_no` varchar(19) NOT NULL COMMENT 'Customer card no', 
`ssn_no` varchar(9) NOT NULL COMMENT 'Customer social security number', 
PRIMARY KEY (`acct_no`,`crd_no`,`ssn_no`) 
) 

私はPHPがMySQLのテーブルからデータを取得使用していませんし、作成しようとしています多次元配列か、既存のjavascript配列と一致するjsonエンコード文字列のいずれかです。新しいレコードがテーブルに追加されると、配列が常に更新されるように、ループ内に配列を構築する必要があります。

正確なコードは必須ではありませんが(歓迎します)、私は単にこれにアプローチする方法の提案を探しています。私は配列を構築し、acct_noとcrd_noまたは3つのすべての固有の組み合わせでフィルタリングすることができますが、私はjavascriptでどのようにしているかのようにPHPで構築された配列をまだ取得していません。最終的な目標は、3つのドロップダウンボックスのセットにjs配列を供給することです。各ボックスの選択された値によって、次のボックスのデータ選択リストが決定されます。今私は、各ボックスから選択が行われたときにdbにクエリするためにajaxを使用してこれを設定できることを知っていますが、私は複数の機会にサーバーにヒットする必要はありません。これを達成するためのその他の推奨事項もプラスです。

以下は、データを操作するJavaScriptコードです。

$(document).ready(function() 
    { 
     document.soapFormSetup.reset(); 

     $(function() 
     { 
      var start = ''; 
      var options = '<option selected value="'+ start +'">-----------------------' + '</option>' ; 

      for (var i = 0; i < accounts.length; i++) 
      { 
       var opt = accounts[i].name ; 

       options += '<option value="' + opt + '">xxxxxxxxxxxxxx' + opt.substring(5) + '</option>'; 
      } 

      $("#sms_acct_no").html(options); 

      start = ''; 
      options = '<option selected value="'+ start +'">-----------------------' + '</option>' ; 

      for (var i=0; i < accounts[0].crd_no.length; i++) 
      { 
       var opt = accounts[0].crd_no[0].name ; 

       options += '<option value="' + opt + '">xxxxxxxxxxxxxx' + opt.substring(12) + '</option>'; 
      } 

      $("#sms_crd_no").html(options); 

      start = ''; 
      options = '<option selected value="'+ start +'">--------------' + '</option>' ; 

      for (var i=0; i < accounts[0].crd_no[0].ssn_no.length; i++) 
      { 
       var opt = accounts[0].crd_no[0].ssn_no[i] ; 

       options += '<option value="' + opt + '">xxx-xx-' + opt.substring(5) + '</option>'; 
      } 

      $("#sms_ssn_no").html(options); 

      document.soapFormSetup.sms_ssn_no.disabled=true; 
      document.soapFormSetup.sms_crd_no.disabled=true; 

      $("#sms_acct_no").bind("change", 
      function() 
      { 
       if ($(this).children(":selected").val() !== "") 
        document.soapFormSetup.sms_crd_no.disabled=false; 
       else 
       { 
        document.soapFormSetup.sms_crd_no.value=""; 
        document.soapFormSetup.sms_ssn_no.value=""; 

        document.soapFormSetup.sms_crd_no.disabled=true; 
        document.soapFormSetup.sms_ssn_no.disabled=true; 
       } 

       for(var i=0; i<accounts.length; i++) 
       { 
        if (accounts[i].name == this.value) 
        { 
         start = ''; 
         var crd_nos = '<option selected value="'+ start +'">-----------------------' + '</option>' ; 

         for (var j=0; j < accounts[i].crd_no.length; j++) 
         { 
          var opt= accounts[i].crd_no[j].name ; 

          crd_nos += '<option value="' + opt + '">xxxxxxxxxxxxxx' + opt.substring(12) + '</option>'; 
         } 

         break; 
        } 
       } 

       $("#sms_crd_no").html(crd_nos); 

       for(var i=0; i<accounts.length; i++) 
       { 
        for(var j=0; j<accounts[i].crd_no.length; j++) 
        { 
         if(accounts[i].crd_no[j].name == $("#sms_crd_no").val()) 
         { 
          start = ''; 
          var crd_ssn_nos = '<option selected value="'+ start +'">--------------' + '</option>' ; 

          for (var k=0; k < accounts[i].crd_no[j].ssn_no.length; k++) 
          { 
           var opt = accounts[i].crd_no[j].ssn_no[k] ; 

           crd_ssn_nos += '<option value="' + opt + '">xxx-xx-' + opt.substring(5) + '</option>'; 
          } 

          break; 
         } 
        } 
       } 

       $("#sms_ssn_no").html(crd_ssn_nos); 

       document.soapFormSetup.sms_ssn_no.disabled=true; 
       document.soapFormSetup.sms_ssn_no.value=""; 
      }); 

      $("#sms_crd_no").bind("change", 
       function() 
       { 
        if ($(this).children(":selected").val() !== "") 
         document.soapFormSetup.sms_ssn_no.disabled=false; 
        else 
        { 
         document.soapFormSetup.sms_ssn_no.value=""; 

         document.soapFormSetup.sms_ssn_no.disabled=true; 
        } 

        for(var i=0; i<accounts.length; i++) 
        { 
         for(var j=0; j<accounts[i].crd_no.length; j++) 
         { 
          if(accounts[i].crd_no[j].name == this.value) 
          { 
           start = ''; 
           var ssn_nos = '<option selected value="'+ start +'">--------------' + '</option>' ; 

           for (var k=0; k < accounts[i].crd_no[j].ssn_no.length; k++) 
           { 
            var opt = accounts[i].crd_no[j].ssn_no[k] ; 

            ssn_nos += '<option value="' + opt + '">xxx-xx-' + opt.substring(5) + '</option>'; 
           } 

           break; 
          } 
         } 
        } 

        $("#sms_ssn_no").html(ssn_nos); 
       }); 
      }); 
    }); 
+0

なぜオブジェクトを混合するのではなく、すべてのオブジェクトを使用するのですか? jsonの構文とIMOには、はるかに近く、視覚的に魅力的で読みやすいでしょう。 – elclanrs

+0

各口座番号は1つ以上のcc番号を持ち、各cc番号は1つ以上のss番号を持っていますか?あなたのデータには常に正しい関係がありますか? – goat

+0

もっと魅力的だと思うほど魅力的だと思います。提案に感謝 – user1391491

答えて

1

Iは、次のコードは同じ、JSONエンコードされた文字列を生成することになると信じて:

$accounts = array(); 
while($row = mysql_fetch_assoc($query)) { 
    $accounts[] = array(
     "name" => $row["acct_no"], 
     "crd_no" => array(
      "name" => $row["crd_no"], 
      "ssn_no" => $row["ssn_no"] 
     ) 
    ); 
} 
echo json_encode($accounts); 
+0

これは近いですが、依然として正確な関係は示されていません...あなたは同じard noですが異なるssn nosを持つアカウントはありません。これは正しい方向を指していますが、ありがとうございます。 – user1391491

+0

OK、DBマップのどのフィールドをJSONのどの部分に教えてください。 –

0

おそらく、単一のアカウント名が複数のカードに関連付けることができる(そうでない場合に、なぜアレイでcrd_noなります)したがって、これを試してみてください:

// Create an array keyed by acct_no, containing arrays of crd_no data 
$accounts = array(); 
while ($row = mysql_fetch_assoc($query)) { 
    if (!isset($accounts[$row["acct_no"]])) { 
     $accounts[$row["acct_no"]] = array(); 
    } 
    $accounts[$row["acct_no"]][] = array(
     "name" => $row["crd_no"], 
     "ssn_no" => $row["ssn_no"] 
    ); 
} 

// but it's not the format you want so now... 
$accounts_formatted = array(); 
foreach ($accounts as $name => $account) { 
    $accounts_formatted[] = array(
     "name" => $name, 
     "crd_no" => $account 
    ); 
} 
echo json_encode($accounts_formatted);