数据表foreach细节/子行

Nev*_*ack 2 javascript ajax jquery datatables

我想显示foreach子行数据表

假设我有这样的ajax数据

"data": [
{
  "date"      : "1/17/2016",
  "supplier"  : "supplier1",
  "total"     : "$10",
  "payment"   : "Cash",
  "product" : Array[2] 
     0: "product1"
     1: "product2"
  "price" : Array[2]
     0: "$5"
     1: "$5"
},
{
  "date"      : "2/1/2016",
  "supplier"  : "supplier2",
  "total"     : "$3",
  "payment"   : "Cash",
  "product" : Array[1] 
     0: "product1"
  "price" : Array[1]
     0: "$3"
},
{
  "date"      : "1/17/2016",
  "supplier"  : "supplier3",
  "total"     : "$15",
  "payment"   : "Cash",
  "product" : Array[3] 
     0: "product1"
     1: "product2"
     2: "product3"
  "price" : Array[2]
     0: "$3"
     1: "$5"
     2: "$7"
},
Run Code Online (Sandbox Code Playgroud)

我想在这里product & price链接创建数据表子行

我只编辑脚本function format以满足我的需要

function format ( d ) {
    // `d` is the original data object for the row
    return '<table class="table table-border table-hover">'+
      '<tr>'+
         '<td>Product</td>'+
         '<td>Price</td>'+
      '</tr>' +

      '<?php 
          $loop = 5; 
          echo $loop;             <-- here

          for ($i=0; $i<$loop; $i++) {                      
             echo "<tr><td>'+d.product['$i']+'</td> <td>'+d.price['$i']+'</tr>"; 
       } ?>' +

    '</table>';
}
Run Code Online (Sandbox Code Playgroud)

它运行得很好......我可以显示我想要的数据......但我必须定义$loop手册......

我尝试使用$loop = "'+d.product.length+'"
当我echo在php中
显示它的显示实际值
(也就是说我的3数组product也显示在它的显示中3)

但不知何故,当它进入for部分它就像$loop变成0
因为不显示任何(如果我设置条件$i<=$loop显示在每个显示的每一行细节)排父母)

我发现了一些奇怪的东西
$loop = "'+d.product_.length+'" . "'+d.product_.length+'";
echo $loop==> 33 (如果产品数组计数是3)

但如果我把它改成sum它的结果0
$loop = "'+d.product_.length+'" + "'+d.product_.length+'";
echo $loop==> 0 (如果产品数组计数也是3如此)

如何解决它,所以我可以知道我的脚本应该做多少循环

Gur*_*Rao 5

你不需要php在这里附加一个循环附加表,而是你可以使用jquery's $.each..你只需要构建你的表体结构append,如下所示:

/* Formatting function for row details - modify as you need */
function format ( d ) {
    console.log(d.product);
    var trs=''; //just a variable to construct
    $.each($(d.product),function(key,value){
        trs+='<tr><td>'+value+'</td><td>'+d.price[key]+'</td></tr>';
        //loop through each product and append it to trs and am hoping that number of price 
        //values in array will be equal to number of products
    })
    // `d` is the original data object for the row
    return '<table class="table table-border table-hover">'+
           '<thead>'+
              '<th>Product</th>'+
                '<th>Price</th>'+  
           '</thead><tbody>' 
               + trs +
        '</tbody></table>';
}

$(document).ready(function() {
    var table = $('#example').DataTable({
        "ajax": 'https://raw.githubusercontent.com/kshkrao3/JsonFileSample/master/Employees.json',
        "columns": [
            {
                "class":          'details-control',
                "orderable":      false,
                "data":           null,
                "defaultContent": ''
            },
            { "data": "date"},
            { "data": "supplier"},
            { "data": "total"},
            { "data": "payment"}
        ]
    });

    // Add event listener for opening and closing details
   $('#example tbody').on('click', 'td.details-control', function () {
        var tr = $(this).closest('tr');
        var row = table.row( tr );

        if ( row.child.isShown() ) {
          // This row is already open - close it
          row.child.hide();
          tr.removeClass('shown');
        }
        else {
          // Open this row
          row.child( format(row.data()) ).show();
          tr.addClass('shown');
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

注意:你的错误click event..你正在尝试dTable.row事件,table.row因为你在table变量中持有引用.

DEMO