【问题标题】:How to loop through JSON Nested array values in PHP? Datatable如何在 PHP 中循环遍历 JSON 嵌套数组值?数据表
【发布时间】:2019-06-09 17:20:35
【问题描述】:

我在 mysql 中的数据库有一个名为“sales”的表,其中有一个字段“products”,其中几个产品在 json 中“出售”,在这个 json 中我只需要获取信息“brand”和“model”将其显示在数据表中,谢谢。

这是我的桌子的图像。

Here is the json [{"id":"312","marca":"NIKON","modelo":"D3400","serie":"8857882","cantidad":"1","stock":"0","precio":"1669","total":"1669"},{"id":"161","marca":"NIKON","modelo":"AF-P NIKKOR 18-55MM 1:3.5-5.6G","serie":"21963658","cantidad":"1","stock":"0","precio":"0","total":"0"}]

public function mostrarTablaSell(){
    $item = null;
    $valor = null;
    $orden = "id";

    $ventas = ControladorVentas::ctrMostrarVentas($item, $valor, $orden);   

    if(count($ventas) == 0){
        echo '{"data": []}';
        return;
    }

    $datosJson = '{
                  "data": [';
    for($i = 0; $i < count($ventas); $i++){
        /*=============================================
          PRODUCTOS
          =============================================*/ 
        $here = json_decode($ventas[$i]["productos"], true);

        foreach ($here as $key => $value) {
            $productos1 = $value['marca'];
            $productos2 = $value['modelo'];
        }

        //$productos0 = $here[0]['categoria'];
        //$productos1 = $here[0]['marca'];
        //$productos2 = $here[0]['modelo'];
        $productos = $productos1 .' '. $productos2;

        /*=============================================
          TRAEMOS LAS ACCIONES
          =============================================*/ 
        if(isset($_GET["perfilOculto"]) && $_GET["perfilOculto"] == "Especial"){
            $botones =  "<div class='btn-group'><button class='btn btn-warning btnEditarVenta' idVenta='".$ventas[$i]["id"]."'><i class='fa fa-pencil'></i></button><button class='btn btn-danger btnEliminarVenta' idVenta='".$ventas[$i]["id"]." '><i class='fa fa-times'></i></button><button class='btn btn-info btnImprimirFactura' codigoVenta='".$ventas[$i]["codigo"]."'><i class='fa fa-print'></i></button></div>"; 
        }else{
            $botones =  "<div class='btn-group'><button class='btn btn-warning btnEditarVenta' idVenta='".$ventas[$i]["id"]."'><i class='fa fa-pencil'></i></button><button class='btn btn-danger btnEliminarVenta' idVenta='".$ventas[$i]["id"]." '><i class='fa fa-times'></i></button><button class='btn btn-info btnImprimirFactura' codigoVenta='".$ventas[$i]["codigo"]."'><i class='fa fa-print'></i></button></div>"; 
        }

        $datosJson .='[
                              "'.($i+1).'",
                              "'.$ventas[$i]["id"].'",
                              "'.$ventas[$i]["codigo"].'",
                              "'.$vendedor.'",
                              "'.$cliente.'",
                              "'.$ventas[$i]["proviene"].'",
                              "'.$productos.'",
                              "'.$ventas[$i]["desp"].'",
                               "'.$ventas[$i]["adelanto"].'",
                              "'.$ventas[$i]["total"].'",
                              "'.$ventas[$i]["estado"].'",
                              "'.$ventas[$i]["obs"].'",
                              "'.$ventas[$i]["fecha"].'",
                              "'.$botones.'"
                            ],';
    }
    $datosJson = substr($datosJson, 0, -1);
    $datosJson .=   '] 
                 }';
    echo $datosJson;
}
}

【问题讨论】:

  • 请避免手动构造json输出字符串。 json_encode() 存在是有原因的。两个$botones 声明不一样吗?为什么是条件块?
  • 并添加到@mickmackusa 的评论中,为什么您将产品以 JSON 格式存储在数据库中?您永远无法轻松搜索这些并在 JSON 上使用索引...理想情况下,您应该规范化该数据或使用 NoSQL 数据库。MySQL 是时候支持 JSONB(二进制 JSON)格式和像 PostgreSQL 一样的原生索引支持了。
  • @mickmackusa 我不知道将图像转换为文本的简单方法。
  • 我一直在忙于修复代码缩进,而不是实际解决答案,去做吧!
  • [{"id":"312","marca":"NIKON","modelo":"D3400","serie":"8857882","cantidad":"1", "stock":"0","precio":"1669","total":"1669"},{"id":"161","marca":"NIKON","modelo":"AF-P尼克尔 18-55MM 1:3.5-5.6G","serie":"21963658","cantidad":"1","stock":"0","precio":"0","total":"0 "}]

标签: php mysql json datatable


【解决方案1】:

我想我理解你的目标。这是一个sn-p...

代码:(Demo)

$ventas[0]["productos"] = '[{"id":"312","marca":"NIKON","modelo":"D3400","serie":"8857882","cantidad":"1","stock":"0","precio":"1669","total":"1669"},{"id":"161","marca":"NIKON","modelo":"AF-P NIKKOR 18-55MM 1:3.5-5.6G","serie":"21963658","cantidad":"1","stock":"0","precio":"0","total":"0"}]';
// do not write the above sample data in your code.

$data = [];

foreach ($ventas as $row) {
    foreach (json_decode($row["productos"], true) as $details) {
        $data[] = [$details['marca'], $details['modelo']];
    }
}

echo json_encode(['data' => $data]);

输出:

{"data":[["NIKON","D3400"],["NIKON","AF-P NIKKOR 18-55MM 1:3.5-5.6G"]]}

使用foreach 代替for 可以避免使用count 并提供更简单的语法。

使用json_encode() 作为最后一步使代码更加稳定和易于阅读。

你真的,真的应该规范你的表结构以允许更容易/更好的查询。存储为 json 需要更多的处理,并破坏了巧妙/直接查询的机会。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    相关资源
    最近更新 更多