用于循环的php数组管理以显示stackbar图

时间:2019-03-22 18:20:42

标签: php

我正在尝试使用此表中的数据创建堆积的条形图:

Image of the table

我需要得到这样的结果才能制作图形:

['oxygen','cpap']   

 Prospecting  [10,12]
 Qualification [15,8]

所有产品的清单以及每个销售阶段的数组,其中包含每种产品的数量。

我可以从下表中获取产品名称列表:

$sql = "SELECT * FROM target_products";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
       $product_name[] = $row['product_name'];
    }
} 

但是我不知道如何以图表所需的格式重新组织它。我该怎么办?

1 个答案:

答案 0 :(得分:0)

与此不同,不仅仅是将行提取到数组中:

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

获得所需结构的总体思路是:

while($row = $result->fetch_assoc()) {
    $graph_data[$row['sales_stage']][$row['product_name']] = $row['qty'];
    //              rows                  columns              values
}

这将创建一个结构,其中每一行都是一个sales_stage,每一列都是一个属于该阶段的product_name

尽管通常不是那么简单。某些阶段可能包含其他产品没有的产品,因此您可能需要跟踪所有产品并将图形数据的缺失值设置为零。

因此请随身携带所有产品清单

$all_products = [];

while($row = $result->fetch_assoc()) {
    $all_products[$row['product_name']] = 0;
    $graph_data[$row['sales_stage']][$row['product_name']] = $row['qty'];
}

然后,在拥有所有数据之后,可以将每一行与完整的产品列表合并,以便每个sales_stage的值与产品标题匹配。

foreach ($graph_data as $sales_stage => $stage_products) {
    $graph_data[$sales_stage] = array_values(array_merge($all_products, $stage_products));
}

然后您可以获得所需的结果:

echo json_encode([
    array_keys($all_products),
    $graph_data
]);

对于所使用的任何图形库,这可能都不是您真正需要的,但是它应该可以使您走上正确的轨道。