Как добавить вычисляемое значение PHP для каждого цикла в Javascript для каждой итерации

#javascript #php #foreach

#javascript #php #для каждого

Вопрос:

У меня есть результат запроса в PHP и с использованием цикла foreach, показывающий результат путем генерации нового tr в html-таблице, но в то же время внутри цикла будет вычислено некоторое значение, которое я хочу показать с помощью Javascript, добавив несколько строк

Как я могу это сделать?

PHP:

   <tbody>
    <?php
    $gTotalBorn = 0;
    $gTotalSanc = 0;
    $bTotalBorn = 0;
    $bTotalSanc = 0;
    foreach ($reNominalRoll as $key => $value) {
        if ($row_area->ADMIN_ID == $value->AREA_ID) {
            $gTotalBorn  = $value->Borne;
            $gTotalSanc  = $value->sanction;
            ?>
            <tr class="allrow">
                <td><?php echo $value->Rank ?></td>
                <td><?php echo $value->Part ?></td>
                <td><?php echo $value->sanction;
                    $bTotalSanc  = $value->sanction; ?></td>
                <td><?php echo $value->Borne;
                    $bTotalBorn  = $value->Borne; ?></td>
                <td><?php echo $value->TotalIn ?></td>
                <td><?php echo $value->TotalOut ?></td>
            </tr>
            <?php
        }
    }
    }
    ?>
    <!--Grand Total Row-->
    <tr>
        <td style="text-align: center; font-weight: bold;" colspan="5">Grand Total</td>
        <td style="text-align: center; font-weight: bold;"><?php echo $gTotalSanc; ?></td>
        <td style="text-align: center; font-weight: bold;"><?php echo $gTotalBorn; ?></td>
        <td></td>
        <td></td>
    </tr>
    </tbody>
  

Javascript:

 if (allrow.hasClass('expectedRow')) {
                    $('.expectedRow').each(function () {
                        let thisRow = $(this);
                        let prevShip = thisRow.prevAll('.ships:first');
                        let prevUnit = thisRow.prevAll('.units:first');
                        let prevBranch = thisRow.prevAll('.units:first');

                        //thisRow.after('<tr><td colspan="6"><strong>Branch Total</strong></td></tr>');
                        thisRow.after('<tr>' 
                                        '<td><strong>Branch Total</strong></td>' 
                                        '<td></td>' 
                                        '<td><strong>' "<?php echo $bTotalSanc; $bTotalSanc = 0;?>" '</strong></td>' 
                                        '<td><strong>' "<?php echo $bTotalBorn; $bTotalBorn = 0;?>" '</strong></td>' 
                                        '<td></td>' 
                                        '<td></td>' 
                                    '</tr>');

                        // below conditions for identify the unit based on rowspan length
                        if (prevUnit.find('td[rowspan]').length == 2) {
                            // ship rowspan incremented by 1
                            let prevShipRowspan = parseInt(prevShip.find('td:first').attr('rowspan'));
                            let newPrevShipRowspan = prevShipRowspan 1;
                            prevShip.find('td:first').attr('rowspan',newPrevShipRowspan);

                            // unit rowspan incremented by 1
                            let unitRowspan = parseInt(prevUnit.find('td:first').attr('rowspan'));
                            let newUnitRowspan = unitRowspan 1;
                            prevUnit.find('td:first').attr('rowspan',newUnitRowspan);

                            // branch rowspan incremented by 1
                            let branchRowspan = parseInt(prevUnit.find('td:eq(1)').attr('rowspan'));
                            let newBranchRowspan = branchRowspan 1;
                            prevBranch.find('td:eq(1)').attr('rowspan',newBranchRowspan);
                        }

                        else if (prevUnit.find('td[rowspan]').length == 3) {
                            // ship rowspan incremented by 1
                            let prevShipRowspan = parseInt(prevShip.find('td:first').attr('rowspan'));
                            let newPrevShipRowspan = prevShipRowspan 1;
                            prevShip.find('td:first').attr('rowspan',newPrevShipRowspan);

                            // unit rowspan incremented by 1
                            let unitRowspan = parseInt(prevUnit.find('td:eq(1)').attr('rowspan'));
                            let newUnitRowspan = unitRowspan 1;
                            prevUnit.find('td:eq(1)').attr('rowspan',newUnitRowspan);

                            // branch rowspan incremented by 1
                            let branchRowspan = parseInt(prevBranch.find('td:eq(2)').attr('rowspan'));
                            let newBranchRowspan = branchRowspan 1;
                            prevBranch.find('td:eq(2)').attr('rowspan',newBranchRowspan);
                        }
                    });
                }
  

В приведенном выше коде, как добавить $bTotalBorn и $bTotalSanc значение add в javascript, но не total, при этом значение цикла синхронно будет обновляться в javascript

Теперь отображается общий итог, подобный этому, но необходимо показать промежуточный итог скриншот

Кто-нибудь может мне помочь?

Комментарии:

1. вы хотите суммировать $ bTotalBorn $ bTotalSanc?

2. @MohammedYassineCHABLI Я обновил вопрос

3. какое ожидаемое значение вы должны получить из приведенной выше таблицы?

4. Возможно, сохранение каждого промежуточного итога в массиве в PHP, а в JS доступ к желаемому промежуточному итогу в функции текущей итерации (первый аргумент .each() ).

5. И почему вы не создали свои промежуточные итоговые строки тоже на PHP?

Ответ №1:

Ниже пример того, что, я думаю, вы пытаетесь сделать.

Я создал пример без PHP, чтобы фрагмент кода работал.

  • Строки таблицы генерируются в середине HTML для максимально возможного соответствия тому, что вы сделали в PHP.
  • Промежуточные ячейки генерируются в Javascript, как в вашем сообщении.

Мой фрагмент приведен здесь только для того, чтобы дать вам начальное решение вашей проблемы. Я сделал это в зависимости от того, как вы хотели бы сделать (я в основном думаю о «со значением цикла синхронно будет обновляться в javascript«, поэтому используйте переменные PHP в JS, если я прав).

 $(document).ready(() => {
  $('table > tbody > tr').each((i, tr) => {
    const subtotalCellHtml = `<td>${subtotalsA[i]}</td><td>${subtotalsB[i]}</td>`;
    
    $(tr).append(subtotalCellHtml);
  });
});  
 table {
  border-collapse: collapse;
}

table td,
table th {
  border: 1px solid #000;
}  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<table>
  <thead>
    <tr>
      <th>Values A</th>
      <th>Values B</th>
      <th>Total A</th>
      <th>Total B</th>
    </tr>
  </thead>

  <tbody>
    <!-- generated <tr> -->
    <!-- below a <script> for imitating your PHP -->
    <script>
      /*
        The code below is in Javascript but should look like your PHP.
        I placed this code part here because your PHP is in the middle your HTML,
        I tried to have something similar of your post.
      */
    
      /** @var {array.<array>} Test values. */
      const valuesA = [[
        4, 5, 9, 1
      ], [
        2, 1, 8, 11
      ]];
      
      const valuesB = [[
        1, 2, 1, 1
      ], [
        3, 1, 1, 1, 2
      ]];
      
      /** @var {array.<number>} List of subtotalsA. */
      let subtotalsA = [],
      /** @var {array.<number>} List of subtotalsB. */
        subtotalsB = [],
      /** @var {number} Total of all valuesA. */
        totalA = 0,
      /** @var {number} Total of all valuesB. */
        totalB = 0;

      $(document).ready(() => {
        for (let i in valuesA) {
          // Line below is the same as looping through valuesA[i] and incrementing a var.
          const sumA = valuesA[i].reduce((acc, e) => (acc   e));
          // Same for valuesB[i]
          const sumB = valuesB[i].reduce((acc, e) => (acc   e));

          subtotalsA.push(sumA);
          totalA  = sumA;
          subtotalsB.push(sumB);
          totalB  = sumB;

          // Building table rows without subtotal like in your PHP.
          const rowHtml = `<tr>
            <td>${valuesA[i].join(', ')}</td>
            <td>${valuesB[i].join(', ')}</td>
          </tr>`;

          $('table > tbody').append(rowHtml);
        }
      });
    </script>
  </tbody>
  
  <tfoot>
    <tr>
      <th colspan="2">Grand Total</th>
      <!-- generated <th> -->
      <script>
        $(document).ready(() => {
          const totalCellHtml = `<th>${totalA}</th><th>${totalB}</th>`;
          
          $('table > tfoot > tr').append(totalCellHtml);
        });
      </script>
    </tr>
  </tfoot>
</table>  

Если мой ответ не исправляет вашу проблему (или не помогает вам), пожалуйста, скажите мне, возможно, я неправильно понял, в чем была ваша проблема.