首先是我现在的取值部分的主要代码//主要部分代码
$offset=$Page_size*($page-1);
$sql="select * from record where officecode='$officecode' and searchtime like '%$riqi%' order by name limit $offset,$Page_size" ;
$result=mysql_query($sql,$link);
//$row=mysql_fetch_array($result);
//while($row=mysql_fetch_array($result)){
while($row=mysql_fetch_array($result)){
?>
<tr> 
<td bgcolor="#E0EEE0" height="25px"><div align="center"> 
<?php echo $row['0']?>
</div></td>
<td bgcolor="#E0EEE"><div align="center"> 
<?php echo $row['name']?> 
</div></td>
<td bgcolor="#E0EEE"><div align="center"> 
<?php echo $row['record']?> 
</div></td>
<td bgcolor="#E0EEE"><div align="center"> 
<?php echo $row['buildname']?> 
</div></td>
<td bgcolor="#E0EEE"><div align="center"> 
<?php echo $row['distance']?> 
</div></td>
<td bgcolor="#E0EEE"><div align="center"> 
<?php
echo  $xingshi=(strtotime($row['arrivetime'])-strtotime($row['gotime']))/60;   //  主要是这部分的计算,现在的这个有问题
?> 
</div></td><td bgcolor="#E0EEE"><div align="center"> 
<?php echo $dotime=(strtotime($row['gotime'])-strtotime($row['arrivetime']))/60 ; ?> 
</div></td>
<td bgcolor="#E0EEE"><div align="center"> 
<?php echo $row['distance']/($dotime/60); ?> 
</div></td>
<td bgcolor="#E0EEE"><div align="center"> 
<?php echo $row['arrivetime']?> 
</div></td>
<td bgcolor="#E0EEE"><div align="center"> 
<?php echo $row['gotime']?> 
</div></td>
</tr>到达时间为I列  出发时间为J列
第一个问题是错行加减例如zhangsan no=2的那行 计算行驶时间需要的是no=2的那行的到达时间减去no=1那行的出发时间
即为10:30减去10:10   经过strotime()/60以后得出时间为20第二问题是 如图那样 在一个页面实现好几名员工的分别合计?
① 如果这样不好实现,单一员工的合计那块代码 应该如何处理或者说 应该如何写?先谢谢大家

解决方案 »

  1.   


    <?php echo $dotime=(strtotime($row['gotime'])-strtotime($row['arrivetime']))/60 ; ?> 这个是我计算作业时间的语句,这块应该没什么问题没想明白的是如何取出来的不同行的数据进行加减,这个可能描述的不是太清楚
    例如我要算zhangsan no=2 这行的数据  其他部分的值 取得的是这样行  而行驶时间计算 赢取此行的到达时间,以及while循环的上一个$row的出发时间的值,即为10:30-10:10
    另外合计应该用哪个函数,请明确说下,谢谢
    还有 关键的是在一个 页面下 几名员工的分别合计 好实现吗?或者我还是最好 按照情况进行合计的检索?
      

  2.   

    1、隔行计算要先缓存一行
    $last = array();
    while($row=mysql_fetch_array($result)){
      if($last) {
        //在这里计算
      }
      $last = $row;
      //其他代码2、求合计用类似的方法,主要是判断缓存的$row['name']是否发生了变化
      

  3.   


    第一个问题,比如我说的那应该在if里面这样写?
    echo  $xingshi=(strtotime($row['arrivetime'])-strtotime($last['gotime']))/60; 第二个 能用代码讲解下吗? 谢谢
      

  4.   

    1、你的 $row['arrivetime']、$last['gotime'] 分属于两条记录
    你这样写就不是错行计算了2、和1的代码一样,只不过把赋值换成累加
      

  5.   


    1.第一点 我就是要用arrivetime那个列的数据,减去gotime字段那个列字段的上一个,从代码来看 成功了
    但是遇到一些问题,就是当order by 到另外一个人的时候 会拿第二个人的arrivetime减去第一个人的gotime
    ,这样就会出现负数的情况,做了一下简单的判断就是当为负数的时候,不进行显示,但是这样做肯定是不严谨的,是不是也应该用这个进行判断(判断缓存的$row['name']是否发生了变化)   这个不太会 能代码说下吗?
    2.我在while循环里,加入了
    <?php
    $j1=$row['distance'];
    $k1=$j1+$j1;
    }
    在循环外面
    <?php echo $k1; ?> 
    这样没有判断$row['name']的变化,只是求了一个整体
    所以还是第一个问题$row['name']的缓存变化 代码应该要如何写?还有就是那个合计的代码要写在哪里?
      

  6.   

    $last = array();
    while($row=mysql_fetch_array($result)) {
      if($last && $row['name'] == $last['name']) {
         //在这里计算
         //在这里累加
      }
      $last = $row;
    只要你理解了就会自己写
      

  7.   


    我是直接在原有的代码基础上进行修改的,例如行驶时间的那部分,直接在原来的地方,改写成这样
    <td bgcolor="#E0EEE"><div align="center"> 
    <?php
    //echo  $xingshi=(strtotime($row['arrivetime'])-strtotime($row['gotime']))/60;  
     if($last && $row['name']==$last['name']){
       echo $xingshi=(strtotime($row['arrivetime'])-strtotime($last['gotime']))/60;
       //$heji=$row['distance'];
       //$heji1=$heji+$heji;
     }
     $last=$row;
    ?> 
    </div></td>这样显示行驶时间 就没有问题了,可是直接写在这里的话,那合计的那部分是不是就不好进行控制了?
    比如计算距离的话,我在里面这样写  
    可是 要将每个人的都区分开,要如何写呢?
    $j1=$row['distance'];
    $sum=$sum+$j1;
      

  8.   

    你这么想:
    $row['name']==$last['name'] 表示的是当前记录和上一条记录是同一个人的,这应该没问题吧?
    那么不相等时就表示换了一个人,对吧?
    虽然我代码中没有 else 分支,你加上不就可以了吗?
      

  9.   


    那个$row['name']==$lastt['name'] 理解没有问题但是对于如何 显示出我在主楼列出的形式还是没能理解要怎么做
    现在我做出的效果如下前三个为一个name  后两个为另一个name的数据 
    主要是没有理解,第一个人名 while遍历完成后,出现合计项 之后再有其他的人名 那应该是另外一个循环了? 或者说是next? 还是没明白要怎么做此页目前的完整代码
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>确认页面</title>
    </head><body>
    <?phpinclude('conn.php');
    $officename=$_POST['officename'];
    $date=$_POST['riqi'];
    $sql1="select * from record where officename='$officename' and searchtime like '%$riqi%' order by name";
    $result1=mysql_query($sql1);
    if(mysql_num_rows($result1)!=0){
    $row=mysql_fetch_assoc($result1) ;
    $officecode=$row['officecode'];

    }
    else{
    echo "没有这样的记录,正在返回确认页面";
    echo "<meta http-equiv='refresh' content='2;url=confirm.php'>";
    }?>日期:<?php echo $date; ?>——待机点NO:<?php echo $officecode; ?>——待机点名称:<?php echo $officename; ?><form name="form3">
    <div align="center">
    <table width="1230" height="103" border="0" align="left" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC"> 
    <tr> 
    <!-- 将要列出的内容-->
    <th width="50" height="38" bgcolor="#E3E3E3" scope="col">员工编号</th> 
    <th width="90" bgcolor="#E3E3E3" scope="col">姓名</th> 
    <th width="70" bgcolor="#E3E3E3" scope="col">NO.</th>
    <th width="40" bgcolor="#E3E3E3" scope="col">物件名称</th>
    <th width="80" bgcolor="#E3E3E3" scope="col">行驶距离</th>
    <th width="80" bgcolor="#E3E3E3" scope="col">行驶时间</th>
    <th width="80" bgcolor="#E3E3E3" scope="col">作业时间</th>
    <th width="100" bgcolor="#E3E3E3" scope="col">行驶速度</th>
    <th width="60" bgcolor="#E3E3E3" scope="col">到达时间</th>
    <th width="60" bgcolor="#E3E3E3" scope="col">出发时间</th>
    </tr> 
    <?php
    $link=mysql_connect('localhost','root','mysql');  //数据库用户名及数据库密码
    mysql_select_db('berecord');  //数据库名称
    mysql_query('set names utf8');$Page_size=10;  //设置每页显示个数$result=mysql_query("select * from record where officecode='$officecode' and searchtime like '%$riqi%' order by name");    //record为表名
    $count = mysql_num_rows($result);
    $page_count = ceil($count/$Page_size);$init = 1;
    $page_len = 7;
    $max_p=$page_count;
    $pages=$page_count;//判断当前页码
    if(empty($_GET['page'])||$_GET['page']<0){
    $page=1;
    }
    else{
    $page=$_GET['page'];
    }$offset=$Page_size*($page-1);
    $sql="select * from record where officecode='$officecode' and searchtime like '%$riqi%' order by name limit $offset,$Page_size" ;
    $result=mysql_query($sql,$link);
    $last=array();
    while($row=mysql_fetch_array($result)){
    /*if($last && $row['name']==$last['name']){
    echo $xingshi=(strtotime($row['arrivetime'])-strtotime($last['gotime']))/60;
       $j1=$row['distance'];
       $sum=$sum+$j1;
    }
    else{

    }
    $last=$row;
    */
    ?>
    <tr> 
    <td bgcolor="#E0EEE0" height="25px"><div align="center"> 
    <?php echo $row['mencode']?>
    </div></td>
    <td bgcolor="#E0EEE"><div align="center"> 
    <?php echo $row['name']?> 
    </div></td>
    <td bgcolor="#E0EEE"><div align="center"> 
    <?php echo $row['record']?> 
    </div></td>
    <td bgcolor="#E0EEE"><div align="center"> 
    <?php echo $row['buildname']?> 
    </div></td>
    <td bgcolor="#E0EEE"><div align="center"> 
    <?php echo $row['distance']?> 
    </div></td>
    <td bgcolor="#E0EEE"><div align="center"> 
    <?php 
     if($last && $row['name']==$last['name']){
      echo $xingshi=(strtotime($row['arrivetime'])-strtotime($last['gotime']))/60;
      //echo $xingshi;
     }
     $last=$row;
    ?> 
    </div></td><td bgcolor="#E0EEE"><div align="center"> 
    <?php echo $dotime=(strtotime($row['gotime'])-strtotime($row['arrivetime']))/60 ; ?> 
    </div></td>
    <td bgcolor="#E0EEE"><div align="center"> 
    <?php echo $row['distance']/($dotime/60); ?> 
    </div></td>
    <td bgcolor="#E0EEE"><div align="center"> 
    <?php echo $row['arrivetime']?> 
    </div></td>
    <td bgcolor="#E0EEE"><div align="center"> 
    <?php echo $row['gotime']?> 
    </div></td>
    </tr>
    <?php
    $j1=$row['distance'];
    $sum=$sum+$j1;
    ?><?php}
    ?>
    <td bgcolor="#E0EEE"><div align="center"> 
    <?php echo $sum."km"; ?> 
    </div></td><?php
    $page_len=($page_len%2)?$page_len:$pagelen+1;//页码个数
    $pageoffset = ($page_len-1)/2; //页码个数左右偏移量$key='<div class="page">';
    $key.="<span>$page/$pages</span>"; //第几页,共几页
    if($page!=1){
    $key.="<a href=\"".$_SERVER['PHP_SELF']."?page=1\">第一页</a>";//第一页
    $key.="<a href=\"".$_SERVER['PHP_SELF']."?page=".($page-1)."\">上一页</a>"; //上一页
    }
    else{
    $key.="第一页";//第一页
    $key.="上一页";//上一页
    }
    if($pages>$page_len){
    //如果当前页小于等于左偏移
    if($page<=$pageoffset){
    $init=1;
    $max_p = $page_len;
    }
    else{
    //如果当前页大于左偏移
    //如果当前页码右偏移超出最大分页数
    if($page+$pageoffset>=$pages+1){
    $init = $pages-$page_len+1;
    }
    else{
    //左右偏移都存在时的计算
    $init = $page-$pageoffset;
    $max_p =$page+$pageoffset;
    }
    }
    }
    for($i=$init;$i<=$max_p;$i++){
    if($i==$page){
    $key.='<span>'.$i.'</span>';
    }
    else{
    $key.="<a href=\"".$_SERVER['PHP_SELF']."?page=".$i."\">".$i."</a>";
    }
    }
    if($page!=$pages){
    $key.="<a href=\"".$_SERVER['PHP_SELF']."?page=".($page+1)."\">下一页</a>"; //下一页
    $key.="<a href=\"".$_SERVER['PHP_SELF']."?page={$pages}\">最后一页</a>"; //最后一页
    }
    else{
    $key.="下一页"; //下一页
    $key.="最后一页";//最后一页
    }
    $key.='</div>';
    //echo $sql;
    ?>
    <tr> 
    <td colspan="13" bgcolor="#E0EEE0"><div align="center"><?php echo $key ?></div></td> 
    </tr> 
    </table> 
    </div>
    <!--
    <div align="center"><?php echo $key ?>&nbsp;&nbsp;第<input type="text" name="page" style="width:25px;" />页
    <input type="button" value="go" onClick="tijiao()">
    </div>
    -->
    <br><br><br><br><br><br>
    </table> 
    <div align="center">
    <br><br><br><br><br><br><br><br><br><br><br><br><br><br>
    <input type="button" value="返回输入页面" onClick="location.href='write.php'" />
    </div>
    </form>
    </body>
    </html>
      

  10.   

    大致这样写,没有环境,无法调试$last = array(); //用于缓存上一记录
    $sum = 0;
    while($row=mysql_fetch_array($result)){
      if($last) {//不是第一次进入
        if($row['name']==$last['name']) {//还是同一个人
          $xingshi = (strtotime($row['arrivetime'])-strtotime($last['gotime']))/60;
          $sum += $row['distance']; //对 $row['distance'] 求和;
        } else {
          //换人了
          $xingshi = 0;
          //输出合计行
          $sum = 0;
        }
      }
      $last = $row; //缓存当前记录供后边使用
      

  11.   


    有km标志 以及后面颜色不同的是进行合计行 
    根据版主你在11楼的回复的情况下写的出现了几个问题:
    1.行驶距离的累加,每个人的第一行的数据没有添加
    我在那个基础上想是不是last的问题,变成这样的话
    $d=$last['distance'];
    $sum+=$row['distance']+$d;
     就又多加了东西了
    第一个人的合计变为19.7 多加了  第二个人的是17.7 这个是对的  需要应该如何处理?2.最后一个人的合计并未进行统计3.做行驶时间的累计
    $sum1+=$xingshi;
    输出的地方 与行驶时间一致,但是如图所示,并不是分别进行累计的  这块应该如何弄呢?
    这个行驶时间不是数据库中的字段$xingshi是通过计算而得来的麻烦了 
      

  12.   

    调试代码需要耐心
    不可能在线你的环境,所以写了测试代码用于调试$ar = array(
      array('id' => 1, 'name' => 'aa', 'len' => 1, 'f1' => 1, 'f2' => 2),
      array('id' => 2, 'name' => 'aa', 'len' => 1, 'f1' => 3, 'f2' => 4),
      array('id' => 3, 'name' => 'aa', 'len' => 1, 'f1' => 5, 'f2' => 6),
      array('id' => 4, 'name' => 'bb', 'len' => 1, 'f1' => 2, 'f2' => 3),
      array('id' => 5, 'name' => 'bb', 'len' => 1, 'f1' => 4, 'f2' => 5),
      array('id' => 6, 'name' => 'bb', 'len' => 1, 'f1' => 6, 'f2' => 7),
      array('id' => 7, 'name' => 'bb', 'len' => 1, 'f1' => 8, 'f2' => 9),
    );$last = array();
    $sub = 0;
    $subtotal = 0;
    $total = 0;foreach($ar as $v) {
      if($last && $v['name'] == $last['name']) {
        $sub = $v['f2'] - $last['f1'];
        $total += $v['len'];
        $subtotal += $sub;
      }else {
        if($last) printf('%s %s %s %s %s %s<br />', '合计', $v['name'], $total, $v['f1'], $v['f2'], $subtotal);
        $total = $v['len'];
        $subtotal = 0;
      }
      $last = $v;
      printf('%s %s %s %s %s %s<br />', $v['id'], $v['name'], $v['len'], $v['f1'], $v['f2'], $sub);
    }
    printf('%s %s %s %s %s %s<br />', '合计', $v['name'], $total, $v['f1'], $v['f2'], $subtotal);
    1 aa 1 1 2 0
    2 aa 1 3 4 3
    3 aa 1 5 6 3
    合计 bb 3 2 3 6
    4 bb 1 2 3 3
    5 bb 1 4 5 3
    6 bb 1 6 7 3
    7 bb 1 8 9 3
    合计 bb 4 8 9 9
      

  13.   


    我的代码最后一个没有合计,我现在想明白了
    一直从数据库遍历数据 做$row['name']是否等于$last['name']的比较
    到最后一条数据时,它不会找到不相等的情况,所以就没有else里的合计输出这种情况下 应该做如何的特殊处理呢?