【问题标题】:Manipulating JSON Array in PHP Using SQL Data使用 SQL 数据在 PHP 中操作 JSON 数组
【发布时间】:2013-10-21 16:43:43
【问题描述】:

我不知道我在做的事情已经超出了我的代码中的内容。在下面的示例中,我试图在每种车道类型的每个电缆类型列和行下都有多种电缆类型,但正如您所见,表中的每个仅显示一种电缆类型。

我正在尝试创建一个 while 循环或其他东西,以便对于每个车道类型,它将产生与所述车道类型关联的尽可能多的电缆类型,然后继续进行下一个车道类型做同样的事情。对于通道 5 和 6,我相信无论如何只有一种电缆类型,所以这些看起来是正确的。如何在 PHP 中创建一个 JSON 数组,为每种车道类型将所有电缆类型分组在一起,而不是将每种电缆类型分别放入单独的数组中?

现在发生的情况是,即使您看到每个通道名称或类型有多种电缆类型,但它们是分开的,我想将它们组合在一起,所以如果我调用 array[0],那将是 Lane-1 的所有电缆类型, array1 将调用 Lane-2 的所有电缆类型等。到目前为止,array[0] 只调用第一个 cable_type 而不是该 lane_name 的电缆类型数组。

****编辑(参考我的最新评论)****

当前 PHP 输出 JSON 数组

{"Lane-1":["PPAHY4614","PPAHY464","HYBP464.01","PPA241807","ADMC1807"],"Lane-2":["HYBP906.1","PPAHY906","HP464.02","PP8HY461"],"Lane-3":["HYBP421","PAADY412"]}

旧图像:

****目前正在工作****

PHP

//Create array
//Define JSON array
$array = array();

//Run SQL for each array value
    $query="(SELECT DISTINCT lane_name,cable_type
        FROM bundle_lanes
        WHERE lane_name != '' AND lane_name != 'Shipped')
        UNION
        (SELECT DISTINCT lane_name,gp_cable_type
        FROM bundle_lanes
        WHERE lane_name != '' AND lane_name != 'Shipped')
        ORDER BY lane_name";

    $result = $mysqli->query($query) or die($mysqli->error.__LINE__);

    while ( $row = $result->fetch_assoc() ) {
        $array[$row['lane_name']][] = $row['cable_type'];
    }

    echo json_encode($array);

Javascript

$.ajax({
    url: './php/populate_cableTypes.php',
    dataType:'json',
    success: function (data) {

        console.log(JSON.stringify(data));

        //since data length is always 1,iterate through the 17 lane types
        for (var n=1; n<=17; n++) {
            //stringify data so it can be manipulated
            var stringifyTypes = JSON.stringify(data["Lane-"+n]);
            //check first if data is not null before populating
            if (stringifyTypes != null) {
                console.log("Lane-" + n + " string cable types: " + stringifyTypes);
                //replace characters with new line breaks to format data
                var cable_types = stringifyTypes.replace(/,/g, '<br />')
                .replace(/\"/g, "")//backslash for quotes and brackets
                .replace(/\[/g, "")
                .replace(/\]/g, "");

                //Show data in newly generated cable type td column for each lane type
                $('td.Lane-'+n+'.weight').after("<td>" + cable_types + "</td>");

                console.log("Lane-" + n + " formatted cable types: " + cable_types);
            }
        }
    }

【问题讨论】:

  • 您的关键问题实际上是您的查询。我不明白您为什么要查询 17 次不同的时间,而您可以在一次查询中获取所有这些数据。先担心得到正确的查询,然后再担心进入 PHP 数据结构。还要考虑您的表结构。如果这些值是互斥的,那么对于 cable_type/gp_cable_type 有不同的列似乎很奇怪。可能是一个单独的 cable_type 列和一个 0/​​1 值“gp”列来表示这是否是“gp”(不管是什么意思)
  • 我查询了 17 个项目,因为数据库中可能有 17 个车道类型(车道 1 到车道 17),我希望每个数据仅与该车道类型有关。也因为我不知道更好......我也不喜欢它,但这是我所知道的生成数据的唯一方法。
  • 至于“互斥”数据,它们需要位于 SQL DB 的两列中,因为客户端就是这样设置的。它们是不同的,不一样的,但需要针对这个特定的实例组合在一起。
  • 您知道您可以通过一次查询选择所有“车道类型”吗?尝试这样的事情,看看它会把你带到哪里:SELECT DISTINT lane_name, cable_type, gp_cable_type FROM bundle_lanes ORDER BY bundle ORDER BY lane_name ASC, cable_type ASC, gp_cable_type ASC
  • 当您使用 PHP 中的结果集时,这非常容易做到。在 fetch 循环 $array[$row['lane_name']][] = $row['cable_type']$array[$row['lane_name']][] = $row['gp_cable_type'] 中类似的内容取决于设置的字段。

标签: php sql arrays json


【解决方案1】:

为什么不使用each?更简洁的数据迭代方式

 $.each(data, function(index, val){
     var n = index + 1;
     $('.cable_type'+n).text(val['cable_type']);
 });

【讨论】:

  • 太棒了!这更正了一些 JS 错误,所以我很高兴。控制台日志将电缆类型和通道名称正确组合在一起,但我现在需要为电缆类型列下的每个通道行正确填充该数据...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 2013-04-04
  • 1970-01-01
  • 2023-04-05
  • 2012-10-07
相关资源
最近更新 更多