多维阵列表人口

时间:2013-10-17 14:15:44

标签: php mysql arrays

尝试通过一个通过MySQL查询提供的数组生成一个表,我们提取一个查询中所需的所有数据并将其存储到一个数组中。

Array Snippett(目前它有超过40个子阵列,但这只是一个例子)

Array
(
[0] => Array
    (
        [Date] => October-2013
        [TotalPaid] => 100.00
        [OrderStatus] => 1
    )

[1] => Array
    (
        [Date] => October-2013
        [TotalPaid] => 150.00
        [OrderStatus] => 2
    )

我们希望的结果是生成一个看起来像

的表
Date           | Processing | Complete | Deleted
October 2013        £150        £100       £0
September 2013      £400        £200       £50

等等(x)年。

我已经设法让表格显示正确的行,但我们遇到的问题是当月没有任何完整交易,所以上述所需的输出结束如

Date           | Processing | Complete | Deleted
October 2013        £150        £100       £0
September 2013      £400        £50

这个代码是

$MasterSQL = "SELECT DATE_Format(DTStamp, ('%M-%Y')) AS 'Date', SUM(TotalPaid) AS 'TotalPaid', OrderStatus FROM bs_orders GROUP BY OrderStatus, EXTRACT(YEAR_MONTH FROM DTStamp) ORDER BY OrderStatus ASC, DTStamp DESC";
        $MasterData= $db->getResults($MasterSQL);

        $Table     = '';
        $Table .= '<h2>Page Title</h2>';
        $Table .= '<p>Some Text</p>';
        $Table .= '<table id="Report">';
            $Table .= '<tr>';
                $Table .= '<th>Pending</th>';
                $Table .= '<th>Complete</th>';
                $Table .= '<th>Problem</th>';
                $Table .= '<th>WP Complete</th>';
                $Table .= '<th>Deleted</th>';
            $Table .= '</tr>';

        $DataArray = array();
        while($row = mysql_fetch_assoc($MasterData)){
            $DataArray[] = $row;
        }

        $DateArr = array();
        foreach($DataArray as $Date){
            if(!in_array($Date['Date'], $DateArr))
            {
                $Table .= '<tr>';
                $Table .= '<td>'.$Date['Date'].'</td>';
                foreach($DataArray as $data){
                    if($data['Date'] == $Date['Date']){
                        $DateArr[] = $Date['Date'];

                        if($data['OrderStatus'] == 1){
                            $Table .= '<td>&pound;'.$data['TotalPaid'].'</td>';
                        }
                        else 
                        if($data['OrderStatus'] == 4){
                            $Table .= '<td>&pound;'.$data['TotalPaid'].'</td>';
                        }
                        else
                        if($data['OrderStatus'] == 3){
                            $Table .= '<td>&pound;'.$data['TotalPaid'].'</td>';
                        }
                        else
                        if($data['OrderStatus'] == 2){
                            $Table .= '<td>&pound;'.$data['TotalPaid'].'</td>';
                        }
                        else
                        if($data['OrderStatus'] == 6){
                            $Table .= '<td>&pound;'.$data['TotalPaid'].'</td>';
                        }

                    } // if($data['Date'] == $Date['Date'])
                } // foreach($DataArray as $data)
                $Table .= '</tr>';
            } // if(!in_array($Date['Date'], $DateArr))
        } // foreach($DataArray as $Date)


        echo '<pre>';
        print_r($DataArray);
        echo '</pre>';

        $Table .= '<tr>';
        $Table .= '<th> </th>';
        $Table .= '<th>Pending</th>';
        $Table .= '<th>Complete</th>';
        $Table .= '<th>Problem</th>';
        $Table .= '<th>WP Complete</th>';
        $Table .= '<th>Deleted</th>';
        $Table .= '</tr>';
        $Table .= '</table>';
        echo $Table;

这可能只是一个我忽略的简单修复,我尝试了很多if else语句的方法,但似乎没有任何工作。

2 个答案:

答案 0 :(得分:1)

您需要一个包含所需列的所有列的数组,顺序正确。然后foreach $ dataArray,循环遍历该列数组,如果数据数组中不存在该值,则打印一个空白单元格。

答案 1 :(得分:0)

在没有SQLFiddle的情况下尽量帮助你......

不要这样做:

...
foreach($DataArray as $Date){
    if(!in_array($Date['Date'], $DateArr))
...

要循环使用这些行,请改为:

...
foreach($DataArray as $rowNum => $row){
...

它不仅更容易阅读,而且会大大简化您的代码,从而消除了“in_array”语句导致问题的可能性(可能是这样)。

或者,如果您希望结果集在列上强制为“0”而不是null(这可能会导致您的问题)。看一下IFNULL MySQL函数。你可以做这样的事情:

IFNULL(Complete , '0')

这会将任何“null”结果更改为0.这也可能会解决您的问题。再一次,你的答案将更适合与小提琴一起工作;潜在的回答者可以抓取您的架构,在AMP堆栈上快速测试它并找到答案。