Вопрос по javascript, json, php, jquery – Создание многомерного объекта для экспорта XML

-1

Я импортирую CSV-файл, который содержит много данных счета. Эти данные необходимо сгруппировать на основе идентификатора поставщика, чтобы отобразить заголовок для каждого поставщика с суммой всех счетов-фактур для этого идентификатора поставщика; а также затем отобразить каждый отдельный счет-фактуру под ним. Цель этого проекта - импортировать CSV, отобразить данные для пользователя, разрешить изменение определенных значений с помощью полей выбора, а затем одним нажатием кнопки экспортировать в XML. XML структурирован аналогично HTML, где по каждой группе счетов-фактур сначала отображаются определенные общие данные, а затем данные о денежном переводе ниже. Чтобы достичь этого, я пытаюсь структурировать объект таким образом, чтобы помочь мне правильно преобразовать его в XML с помощью этогоhttp://goessner.net/download/prj/jsonxml/ .

Проблема: вторые два платежа должны быть сгруппированы вместе, и я бы хотел, чтобы массив создавался для каждой строки подробных данных, а затем добавлялся в основной объект в атрибут PmtDetail. На данный момент этот код рекламирует только первую строку, а остальные игнорирует.

Фрагмент CSV (я не включаю все строки, которые используются в коде здесь)

 ID         CardCode   payment_sum    amount     
 1610165    BENV5271    100            100 
 1609026    BENV5635    509.85         287.33
 1609025    BENV5635    509.85         222.52 

JSON

 [{"DocNum":"1610165","CardCode":"BENV5271","InvPayAmnt":"100.00","PmntDate":"2012-03-29","payment_sum":"100.00"},
 {"DocNum":"1609026","CardCode":"BENV5635","InvPayAmnt":"287.33","PmntDate":"2012-03-29","payment_sum":"509.85"},  
 {"DocNum":"1609025","CardCode":"BENV5635","InvPayAmnt":"222.52","PmntDate":"2012-03-29","payment_sum":"509.85"}]

Jquery

 $(document).ready(function() {
    $.getJSON('CSV.php', function(data) {

    var prevCardCode = '';
    var newDiv; var NewDiv2;
var PaymentFormat;

    $.each(data, function(index, element) { //looping once to display header info such as sum
        XMLObject = []; // Creating a new object for each row     

        if (element['CardCode'] != prevCardCode) {

            XMLObject.Vendor_Sum = element['payment_sum'];
            XMLObject.Name1 = element['CardName'];
            XMLObject.Addr1 = element['Address'];

            console.log(XMLObject);

            newDiv = $('<div/>').addClass('row').appendTo('#showdata');
            $('<div class="sum_field">' + 'Total: ' + element['payment_sum'] + '</div>').appendTo(newDiv);

                $('<div class="options">Payment Format: <select name="Payment_Format" id="Payment_Format"><option value="CTX" selected="selected">Company to Company</option><option value="PPD">Company to Person</option></select> </div><div id="Selected_Format"></div>').appendTo(newDiv);

                XMLObject.paymentFormat = $('select#Payment_Format').val();;

                $('select#Payment_Format').change(function(){
                    PaymentFormat = $(this).val();
                    XMLObject.paymentFormat = PaymentFormat;
                });

        }

        newDiv2 = $('<div/>').addClass('sub_row').appendTo(newDiv);

        prevCardCode = element['CardCode'];

        $.each(element, function(key, value) { looping 2nd time to display the detail info
            XMLObjectDetail = {};   // Creating an array for each row of detail info

            XMLObjectDetail['TotalCurAmount'] = element['InvPayAmnt']; 
            XMLObjectDetail['NetCurAmount'] = element['InvPayAmnt'];

                   $('<div class="field">' + value + '</div>').appendTo(newDiv2);
                   XMLObject.PmtDetail =  XMLObjectDetail;
             });      
         });
     });
  });

PHP

 <?php 
  if (($handle = fopen('upload/BEN-new.csv', "r")) === FALSE) {
    die('Error opening file'); 
 }

 $headers = fgetcsv($handle, 1024, ',');
 $complete = array();

while ($row = fgetcsv($handle, 1024, ",")) {
       $complete[] = array_combine($headers, $row);
}
    fclose($handle);

    echo json_encode($complete);

? & GT;

Элемент CSV-данных, преобразованный в JSON, я добавил выше. MG1
Вы можете попробовать$.extend({}, value); Ja͢ck
Что такоеelement? Kevin B
Это не действительно JSON ..= должно быть: Explosion Pills
console.log весь массив, илиconsole.log каждый элемент в$.each с помощьюconsole.log(key,value) я не думаю, что вам нужно$.extend Kevin B

Ваш Ответ

2   ответа
0

 while ($row = fgetcsv($handle, 1024, ",")) {
               $cardCodes[] = array_combine($headers, $row);
        }

            foreach ($cardCodes as $key => $value) {

                $payments[$value['ggg']]['aaa']['xxx'] = 'element['gggg']';
            }
            echo json_encode($payments);

Затем прочитайте эти данные с помощью JS.

Этот ответ относится к другому твоему вопросу ... Bergi
1

$.each(data, ... //looping once to display header info such as sum Ты нигде не собираешь сумму. Кроме того, это единственный цикл, который перебирает всеdata строки.XMLObject = []; // Creating a new object for each row - Нет, вы создаете массив. Вы действительно должны создать объект {}), потому что вы используете его как объект.XMLObject =.... Вам не хватаетvar ключевое слово здесь. Вы создаете новый объект каждую итерацию, но присваиваете каждому из них одну и ту же глобальную переменную. Это причина, по которой#Payment_Formatбработчик @ change будет изменять только формат последнего созданного объекта - тот, на который в настоящий момент ссылается "XMLObject».$('...<select name="Payment_Format" id="Payment_Format">...') Вы создаете выбор смне б каждая итерация. Как вы думаете, этот идентификатор будет уникальным? Вот почему('select#Payment_Format') выберет не элемент, созданный в текущей итерации.$.each(element... looping 2nd time to display the detail info Нет. Это не второй цикл, а цикл, который будет перебирать свойства текущегоelement - цикл будет применен к каждому из повторяющихсяdata -Rows.XMLObjectDetail = {}; // Creating an array for each row of detail info - Нет, вы создаете объект. Опять же, вам не хватаетvar ключевое слово.(редактировать)XMLObject.PmtDetail = XMLObjectDetail; - вы перезаписываете свойство "PmtDetail" при каждой итерации здесь. Разве это не должен быть массив, к которому вы добавляете? В конце кода цикла у вас естьXMLObject, содержащий данные о текущей строке. Разве вы не хотите что-то с этим делать, например, помещать это в массив объектов-строк?

Ладно, думаю, теперь я получаю то, чего ты пытаешься достичь. Соответствующая структура может быть:

[ {
    "CardCode":"BENV5271"
    "details": [ {
        "DocNum": "1610165",
        "InvPayAmnt": "100.00",
        "PmntDate": "2012-03-29"
      } ],
     "payment_sum": "100.00"
   }, {
     "CardCode": "BENV5635",
     "details": [ {
         "DocNum": "1609026"  
         "InvPayAmnt": "287.33",
         "PmntDate": "2012-03-29"
       }, {
         "DocNum": "1609025",
         "InvPayAmnt": "222.52",
         "PmntDate": "2012-03-29"
       } ],
     "payment_sum": "509.85"
    } ]

или то же самое, просто как Object (key-value-map) по id:

{
    "BENV5271" : {
        "details": {
            "1610165": {
                 "InvPayAmnt": "100.00",
                 "PmntDate": "2012-03-29"
             }
         }
         "payment_sum": "100.00"
     },
     "BENV5635": {
         "details": {
             "1609026": {
                 "InvPayAmnt": "287.33",
                 "PmntDate": "2012-03-29"
             },
             "1609025": {
                 "InvPayAmnt": "222.52",
                 "PmntDate": "2012-03-29"
             }
        },
        "payment_sum": "509.85"
    }
}

Вы также можете использовать числовой тип JSON для числовых значений вместо строк :-) Вы должны создать эту структуру сразу же из своей базы данных. Как вы уже видели, CSV - не лучшее представление для него, и, поскольку JSON и XML способны его представить, вам не следует переходить на SQL-> CSV-> JSON (таблица) -> JSON (структурированный) -> XML, но SQL- > JSON (структурированный) -> XML или, еще лучше, SQL-> XML. Вы можете легко читать XML с помощью Ajax и изменять его DOM в JavaScript.

Если вам действительно нужно провести реструктуризацию от плохо сформированных объектов к хорошей структуре в JS, это будет код:

var cards = {}; // an object indexed by the CardCodes;
for (var i=0; i<data.length; i++) { // loop through the received JSON
    // data[i] equals the "element" variable from your code
    var code = data[i].CardCode;
    if (! code in cards) { // there is no card with that code
        cards[code] = {
            vendorSum: data[i].payment_sum,
            name: data[i].CardName,
            addr: data[i].Address,
            ...
            pmtDetail: [] // create array for the details
        };
    } // else: element already created
    cards[code].pmtDetail.push({
        docNum: data[i].DocNum, 
        amount: data[i].InvPayAmnt
        ...
    }); // adds a new detail object to the array
}
Как я уже упоминал ниже, вам не следует делать такую реструктуризацию в JavaScript. Это легко возможно, особенно второе, но лучше сделать это при создании PHP. Bergi
Сумма не рассчитывается с помощью javascript, я хотел выполнить эту часть в SQL, поэтому в каждой строке уже есть сумма. SQL вычисляет SUM путем группировки счетов на основе идентификатора поставщика. MG1
Так что это, вероятно, главная ошибка здесь, я не знаю, как структурировать JSON, чтобы отразить это, и поэтому пытаюсь сделать это позже с объектами. Следовательно, присваивая массив XMLObjectDetail для XMLObject.PmtDetail. MG1
И второй цикл добавляет только один массив к основному объекту, тогда как в этом примере их должно быть 2. MG1
Ладно, тогда вам нужно следить за тем, чтобы суммы правильно передавались в вашей структуре JSON, они не должны быть частью массива "lines". Bergi

Похожие вопросы