【问题标题】:How to correctly format a PHP foreach loop?如何正确格式化 PHP foreach 循环?
【发布时间】:2016-10-10 10:11:33
【问题描述】:

我有一个 PHP PDO 查询,它从数据库中选择年、月和日。它还计算每天的行数:

    SELECT  
    dateYear, dateMonth, dateDay, 
    count(dateDay) AS count_days
    FROM just_ink 
    WHERE dateMonth = :month AND dateYear = :year AND deleted = 0  
    GROUP BY dateYear, dateMonth, dateDay

回显结果时:

 foreach ($result as $subResult) {
     foreach ($subResult as $row) {
        $year = $row['dateYear'];
        $month = $row['dateMonth'];
        $day = $row['dateDay'];
        $count = $row['count_days'];
        echo $month . " " . $day . " " . $year . " " . $count . " lines, ";
    }
}

这会返回一个类似的值:

June 7 2016 3 lines, June 8 2016 1 lines,

这意味着,6 月 7 日有 3 个表格,6 月 8 日有 1 个表格。

现在进行格式化,我使用Highcharts 基本折线图。数据需要这样格式化:

<script>
$(function () {
    $('#container').highcharts({
    title: {
        text: 'Monthly New Forms',
        x: -20 //center
    },
    xAxis: {
    title: {
                text: 'Day of the Month'
    },
        categories: [
        '1', '2', '3', '4', '5',
        '6', '7', '8', '9', '10',
        '11', '12', '13', '14', '15',
        '16', '17', '18', '19', '20',
        '21', '22', '23', '24', '25',
        '26', '27', '28', '29', '30',
        '31' 
        ]
    },
    yAxis: {
        title: {
            text: 'Month of June'
        },
        plotLines: [{
            value: 0,
            width: 1,
            color: '#808080'
        }]
    },
    tooltip: {

    },
    legend: {
        layout: 'vertical',
        align: 'right',
        verticalAlign: 'middle',
        borderWidth: 0
    },
    series: [{
        name: 'Number of New Forms Per Day',
        data: [1, 2, 3, 4, 5, 6]
    }]
});
});
</script>

其中类别是 x 轴标题,系列数据是每天的频率。所以如果我想代表

June 7 2016 3 lines, June 8 2016 1 lines,

系列数据需要看起来像

0, 0, 0, 0, 0, 0, 3, 1, 0, etc. 

有什么想法吗?

【问题讨论】:

  • 按照 highcharts 想要的方式构建一个数组,并使用json_encode() 将其发送到 javascript。
  • @jeroen 你如何“构建”一个数组?
  • 正如@jeroen 所说,创建一个 php 数组(或特别是关联数组)并将其传递给 echo json_encode。更多信息在这里:php.net/manual/en/function.json-encode.php

标签: javascript php mysql pdo highcharts


【解决方案1】:

首先为每个月的每一天创建一个包含元素的数组:

$counts = array_fill(1, 31, 0);

然后在你的循环中,填写当天的条目:

foreach ($subresult as $row) {
    $day = $row['dateDay'];
    $counts[$day] = $row['count_days'];
}
$counts = array_values($counts); // because json_encode treats it as an object if indexes don't start at 0
echo json_encode($counts);

我不确定您为什么选择 dateYeardateMonth,因为它们是查询的输入。您无需在循环中设置这些变量,因为它们总是相同的。

【讨论】:

  • 这似乎奏效了,结果是 [0,0,0,0,0,0,0,"3","1",0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 但是,它似乎加了 1 个零,所以应该是“3”要在 7 日 int 是在 8 日
  • 我将起始元素从 0 更改为 1。我已经习惯了从 0 开始的数组,但这不适用于一个月中的几天。
  • 添加 2 行代码使这项工作:unset($counts[0]); AND $counts = array_values($counts);非常感谢您的帮助!
  • 更改array_fill中的起始索引没有解决问题吗?如果您稍后要取消设置,为什么还要设置?
  • 您也可以使用array_shift($counts) 删除第一个元素。
【解决方案2】:
$highchartdata = []

foreach ($subResult as $row) {
    $highchartdata[$row['dateDay']] = $row['count_days'];
  }

echo json_encode($highchartdata);

从服务器获取上面的json数据

 obj = JSON.parse(data);// parse the json data
 for (i = 1; i <=31; i++) { 
    if(!obj[i]) // if ith key is not defined make it 0
     obj[i]=0;
  }

console.log(obj);

【讨论】:

  • 回显 json_encode(#highchartsdata);这回显: {"7":"3","8":"1"} 但在控制台日志中:“Uncaught ReferenceError: data is not defined”
猜你喜欢
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 2015-07-04
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
相关资源
最近更新 更多