尝试通过一个通过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>£'.$data['TotalPaid'].'</td>';
}
else
if($data['OrderStatus'] == 4){
$Table .= '<td>£'.$data['TotalPaid'].'</td>';
}
else
if($data['OrderStatus'] == 3){
$Table .= '<td>£'.$data['TotalPaid'].'</td>';
}
else
if($data['OrderStatus'] == 2){
$Table .= '<td>£'.$data['TotalPaid'].'</td>';
}
else
if($data['OrderStatus'] == 6){
$Table .= '<td>£'.$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语句的方法,但似乎没有任何工作。
答案 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堆栈上快速测试它并找到答案。