แนวทางการแทรกแถว ผลรวมในตารางข้อมูลต่อเนื่อง ด้วย php

เขียนเมื่อ 7 ปีก่อน โดย Ninenik Narkdee
array php แทรกผลรวม

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ array php แทรกผลรวม



เนื้อหาต่อไปนี้เป็นแนวทางการประยุกต์การแสดงข้อมูล โดยทำการแทรกส่วนการแสดง
ผลรวมข้อมูลของแต่ละชุดข้อมูล ในที่นี้จะอ้างอิงจากวันที่ สามารถนำไปประยุกต์เป็นกรณี
อื่นๆ ได้
 
คำสั่ง sql ตารางสำหรับทดสอบ

--
-- Table structure for table `tbl_sale`
--

CREATE TABLE IF NOT EXISTS `tbl_sale` (
  `sale_id` int(11) NOT NULL,
  `sale_date` date NOT NULL,
  `sale_name` varchar(50) NOT NULL,
  `sale_product` varchar(50) NOT NULL,
  `sale_price` int(11) NOT NULL,
  `sale_com` int(11) NOT NULL
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

--
-- Dumping data for table `tbl_sale`
--

INSERT INTO `tbl_sale` (`sale_id`, `sale_date`, `sale_name`, `sale_product`, `sale_price`, `sale_com`) VALUES
(1, '2015-07-01', 'Seller A', 'Product A', 300, 60),
(2, '2015-07-01', 'Seller A', 'Product B', 450, 90),
(3, '2015-07-01', 'Seller B', 'Product B', 450, 90),
(4, '2015-07-02', 'Seller A', 'Product C', 550, 110),
(5, '2015-07-02', 'Seller B', 'Product E', 550, 110),
(6, '2015-07-02', 'Seller B', 'Product F', 700, 140),
(7, '2015-07-03', 'Seller A', 'Product G', 400, 80);

--
-- Indexes for dumped tables
--

--
-- Indexes for table `tbl_sale`
--
ALTER TABLE `tbl_sale`
  ADD PRIMARY KEY (`sale_id`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `tbl_sale`
--
ALTER TABLE `tbl_sale`
  MODIFY `sale_id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=8;

 
ตารางสำหรับทดสอบ
 
Date Product Price Com.
2015-07-01 Product A 300 60
2015-07-01 Product B 450 90
2015-07-01 Product B 450 90
2015-07-02 Product C 550 110
2015-07-02 Product E 550 110
2015-07-02 Product F 700 140
2015-07-03 Product G 400 80
 
จากตัวอย่างตาราง จะเป็นตาราง tbl_sale แสดงรายการขายของ สินค้า แสดง
ชื่อสินค้า ราคา และ คอมมิชชั่น 2% ของราคาขาย
สิ่งที่เราต้องการคือ ต้องการแสดงผลรวมราคา หรือยอดขายในแต่ละวัน และค่าคอมมิชชั่นในแต่ละวัน
รวมทั้งผลรวมสะสมของทั้งสองรายการในแต่ละวันด้วย
 
ผลที่ได้
 
Date Product Price Com.
2015-07-01 Product A 300 60
Product B 450 90
Product B 450 90
รวมรายวัน 1200 240
รวมสะสม 1200 240
2015-07-02 Product C 550 110
Product E 550 110
Product F 700 140
รวมรายวัน 1800 360
รวมสะสม 3000 600
2015-07-03 Product G 400 80
รวมรายวัน 400 80
รวมสะสม 3400 680

 
 
ต่อไปจะเป็นกรณีการใช้งานกับฐานข้อมูล 
โดยเราจะใช้วิธีการเชื่อมต่อแบบ 
mysqli แทน mysql ธรรมดา เพื่อรองรับในอนาคต
 
ดาวน์โหลดไฟล์ พร้อมใช้ ชื่อ db_connect.php ได้ที่

 
โค้ดตัวอย่างทั้งหมด คำอธิบายแสดงในโค้ด
 
<?php
include("db_connect.php"); // เรียกใช้ไฟล์ ตั้งค่า และฟังก์ชั่น เกี่ยวกับฐานข้อมูล  
$mysqli = connect(); // สร้าง ตัวแปร mysqli instance สำหรับเรียกใช้งานฐานข้อมูล  
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">   
</head>
<body>
 <br>
 <br>
 <br>
<div style="margin:auto;width:80%;">
 
 
 <br>
 <br>
  
<table class="table table-bordered table-condensed" style="width:550px;">
<thead>
    <tr class="bg-success">
        <th>Date</th>
        <th>Product</th>
        <th>Price</th>
        <th>Com.</th>
    </tr>
</thead>
<tbody>
<?php

// ส่วนของการกำนหดแสดงการแบ่ง ส่วนของข้อมูลของวันที่ที่ต่างกัน
$temp_data1=null;    
$temp_data2=null;    
$data_show=1;    // 1 แสดง 0 ไม่แสดง   
// กำหนดสำหรับอ้างอิง key ของตัวแปร
$i=1;

// ส่วนกำหนดตัวแปร สำหรับเก็บค่าวันที่ และเปรียบเทียบ
$arr_dateCheck=[];

// ส่วนกำหนดตัวแปรสำหรับเก็บค่าข้อมูลสะสมในแต่ละ คอลัมน์ที่ต้องการ กำหนดเป็น array
$aggre_price=[];
$aggre_com=[];

// ส่วนกำหนดตัวแปรสำหรับเก็บค่าข้อมูลในแต่ละ คอลัมน์ที่ต้องการ กำหนดเป็น array
$data_price=[];
$data_com=[];

$q="
SELECT * FROM tbl_sale ORDER BY sale_date
";
$rs=$mysqli->query($q);
$total=$rs->num_rows;
while($data=$rs->fetch_assoc()){
    $show_row_end=0; // เริ่มต้นการแบ่ง กำหนดเป็น 0
    // จัดรูปแบบ key วันที่ที่จะใช้เก็บข้อมูล (หากไม่ได้ใช้วันที่ ประยุกต์เป็นอย่างอื่นตามต้องการ)
    $dateKey=date("dmY",strtotime($data['sale_date']));

    /// ส่วนของการกำนหด การเปรียบค่าของรายการ เพื่อแบ่งวันที่เป็นสัดส่วน
    $temp_data1=$data['sale_date'];    
    if($temp_data2==null){    
        $temp_data2=$temp_data1;    
        $data_show=1;       
    }else{    
        if($temp_data1==$temp_data2){    
            $data_show=0;     
            $temp_data2=$temp_data1;    
        }else{  
            $temp_data2=$temp_data1;    
            $data_show=1;                 
        }  
    }      
    
    // เก็บค่าวันที่ของรายการข้อมูลไว้ในตัวแปร สำหรับเปรียบเทียบ
    $arr_dateCheck[$i]=$data['sale_date']; 
    // ถ้าไม่ใช้ข้อมูลรายการแรก และ ข้อมูลวันที่รายการก่อนหน้า ไม่เท่ากับรายการที่กำลังแสดง
    // นั่นหมายถึงจุดที่เราจะกำหนดว่า เป็นรายการสุดท้ายของวันที่หนึ่งๆ 
    if($i>1 && $arr_dateCheck[$i-1]!=$data['sale_date']){
        // กำหนด key วันที่ที่จะเช็ค
        $dateKeyCheck=date("dmY",strtotime($arr_dateCheck[$i-1]));
        $show_row_end=1; // ให้แสดง หรือแทรกแถวที่ต้องการได้
    }

    // ส่วนของการเก็บข้อมูลไว้ใน array เพื่อใช้งานผลรวม
    if(!isset($data_price[$dateKey])){ // ถ้าไม่มีตัวแปร
        $data_price[$dateKey]=[]; // ให้กำหนด
        array_push($data_price[$dateKey],$data['sale_price']); // และเพิ่มค่า
    }else{
        array_push($data_price[$dateKey],$data['sale_price']); // เพิ่มค่าใน array
    }
    if(!isset($data_com[$dateKey])){
        $data_com[$dateKey]=[];
        array_push($data_com[$dateKey],$data['sale_com']);
    }else{
        array_push($data_com[$dateKey],$data['sale_com']);
    }    
    
    
?>
    <?php 
    // แทรกแถวที่ต้องการกรณีปกติ กรณีนี้ รายการสุดท้ายจะไม่ขึ้น เราจะเพิ่มการแทรกไว้ด้านหลัง
    // ของข้อมูลแทน
    if($show_row_end==1){?>  
    <?php
    // รวมค่าข้อมูลแต่ละวัน แล้วเพิ่มเข้าไปใน array รายการค่าสะสม    
    array_push($aggre_price,array_sum($data_price[$dateKeyCheck]));         
    array_push($aggre_com,array_sum($data_com[$dateKeyCheck]));    
    ?>
    <tr class="bg-warning">
        <td class="text-right">รวมรายวัน</td>
        <td></td>
        <td><?=array_sum($data_price[$dateKeyCheck])?></td>
        <td><?=array_sum($data_com[$dateKeyCheck])?></td>
    </tr>
    <tr class="bg-info">
        <td class="text-right">รวมสะสม</td>
        <td></td>
        <td><?=array_sum($aggre_price)?></td>
        <td><?=array_sum($aggre_com)?></td>
    </tr> 
    <?php } ?>     
    <tr>
        <td>
        <?php if($data_show==1){?>  
        <?=$data['sale_date']?>
        <?php } ?>
        </td>
        <td><?=$data['sale_product']?></td>
        <td><?=$data['sale_price']?></td>
        <td><?=$data['sale_com']?></td>
    </tr>  
    <?php if(
    // สำหรับแทรก กรณีเป็นรายการสุดท้ายในตาราง    
    $i==$total){?> 
    <?php
    // รายการสุดท้าย กำหนด key เช็คเป็นค่าที่รูปแบบตรงกัน    
    $dateKeyCheck=date("dmY",strtotime($data['sale_date']));    
    // รวมค่าข้อมูลแต่ละวัน แล้วเพิ่มเข้าไปใน array รายการค่าสะสม   
    array_push($aggre_price,array_sum($data_price[$dateKeyCheck]));         
    array_push($aggre_com,array_sum($data_com[$dateKeyCheck]));    
    ?>    
    <tr class="bg-warning">
        <td class="text-right">รวมรายวัน</td>
        <td></td>
        <td><?=array_sum($data_price[$dateKeyCheck])?></td>
        <td><?=array_sum($data_com[$dateKeyCheck])?></td>
    </tr>
    <tr class="bg-info">
        <td class="text-right">รวมสะสม</td>
        <td></td>
        <td><?=array_sum($aggre_price)?></td>
        <td><?=array_sum($aggre_com)?></td>
    </tr> 
    <?php } ?>       
<?php $i++; } ?>    
</tbody>
</table>
          

    
</div>    
          
</body>
</html>
 
 
เนื้อหาส่วนนี้ค่อนข้างซับซ้อนและมีรูปแบบการใช้งานที่จำเป็นต้องทำความเข้าใจ
สามารถนำไปประยุกต์กับรูปแบบ หรือตารางอื่นๆ ได้


กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ








เนื้อหาพิเศษ เฉพาะสำหรับสมาชิก

กรุณาล็อกอิน เพื่ออ่านเนื้อหาบทความ

ยังไม่เป็นสมาชิก

สมาชิกล็อกอิน



( หรือ เข้าใช้งานผ่าน Social Login )




URL สำหรับอ้างอิง











เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ