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

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

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

ดูแล้ว 9,478 ครั้ง


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





คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


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







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