2017-05-16 2 views
1

私は従業員がmonth.Theテーブルの毎日がthis- monthly attendance sample picPHP月次出欠表

ようなPHPコードを見えてきましたどのように多くの時間表示、毎月出席システムを作成しようとしています -

$s = $_GET['s']; 
$y = date('Y'); 

$fdt = date('Y-m-d',strtotime($y.'-'.$s.'-'.'01')); 
$ldt = date('Y-m-t',strtotime($y.'-'.$s.'-'.'01')); 
$nd = date('t',strtotime($y.'-'.$s.'-'.'01')); 
$stmt = $pdo->prepare("SELECT emp_id_fk, Resource_Name , ROUND(SUM(TIME_TO_SEC(TIMEDIFF(COALESCE(`end_time`,NOW()),`start_time`)))/3600,1) as Hrs, CAST(`start_time` AS DATE) as cd FROM `attendance` LEFT JOIN resource ON attendance.`emp_id_fk` = resource.`Resource_ID` WHERE CAST(`start_time` AS DATE) BETWEEN :s AND :e GROUP BY emp_id_fk, Resource_Name, CAST(`start_time` AS DATE)"); 

$stmt->bindParam(':s', $fdt); 
$stmt->bindParam(':e', $ldt); 

$stmt->execute(); 
$data = $stmt->fetchAll(); 
print_r($data); 
$ret = ""; 
$id = array_column($data,'emp_id_fk'); 
$name = array_column($data,'Resource_Name'); 
$id = array_unique($id); 
$name = array_unique($name); 

for($i=0;$i<sizeof($id); $i++){ 
    $ret.='<tr> 
      <td>'.$name[$i].'</td>'; 

     for($j=0; $j<sizeof($nd); $j++){ 
      $cd = date('Y-m-d',strtotime($y.'-'.$s.'-'.($j+1))); 
      $d = date('l',strtotime($y.'-'.$s.'-'.($j+1))); 

      if($d != 'Sunday' && $d != 'Saturday'){ 

       for($k=0; $k<sizeof($data); $k++){ 

        if($id[$i] == $data[$k]['emp_id_fk']){ 

         if($cd == $data[$k]['cd']){ 
          $ret.='<td>'.($data[$k]['Hrs']).'</td>'; 
         }else{ 
          $ret.='<td>0</td>'; 
         } 
        } 
       } 
      } 

     } 
    $ret.='</tr>'; 
} 

echo $ret; 

イメージからわかるように、2番目のforloop($ jループ)は、その月に基づいて28,30または31回繰り返す必要がある場所で1回しか反復しません。私の予想される結果は、従業員ごとに毎週の値があるはずで、特定の日付のレコードがない場合は、0が表示されるはずです。

ありがとうございます。

+1

、$ jの<はsizeof($ NDは)おそらく犯人はそれはsizeofが配列を期待し、しかしでは、$ ND 5行目に設定した日付にすぎません.2回実行しても驚いています。 –

+0

64ビットバージョンのPHPを実行していることをお勧めします。そうでない場合は、実際にDateTimeオブジェクトを調べる必要があります:http://php.net/manual/en/class.datetime.php。 2038年問題:https://en.wikipedia.org/wiki/Year_2038_problem – ctwheels

答えて

2

PHP関数sizeof()は、count()のエイリアスです。 関数count()は、配列内のすべての要素またはオブジェクト内の何らかの要素を数えます。

変更:

for($j=0; $j<sizeof($nd); $j++){ 

へ:私が見ることができるものから、

for($j=1; $j<=$nd; $j++) { 
+0

ありがとう!ルーキーミス。 –

+0

よろしくお願いします!私はあまりにも多くの日にコードにいた場合、私はこれもこのような事に悩まされる。時には別の目を持つことが良いこともあります。 :-) – Cagey215