質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

6238閲覧

PHP 一ヶ月の実働時間の合計を出したい

Z-TALBO

総合スコア525

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2016/03/19 07:31

編集2016/03/22 04:29

タイムカードを作成しております。
現在、打刻する仕組みや、検索する仕組み、表示、修正、削除といった仕組みに関してはなんとか形になってきております。

最後に、集計といいますか、一ヶ月分の実働の合計を出す仕組みを探しております。

PHP

1// 少し、回答者様からすると、無駄の多いコードになっているかもしれませんが、ご容赦ください。。。。 2 3// 基本的に、年月と名前を選択して、検索します。 4// 結果としては、○○年○○月の○○さんのデータという形になります。 5// 並びは昇順です。 6 7// DB接続 SELECT実行 8省略いたします 9$stmt->execute(); 10 11while ($row = $stmt->fetch()) : 12$data = []; 13$jitsudo = 0; 14// datetimeを分解 15$datetime = $row['period_dttm']; 16list($year, $month, $day, $hour, $minutes, $second) = preg_split('/[-: ]/', $datetime); 17 18// 丸め処理 19$minutes = round($minutes / 5) * 5; 20$time = mktime($hour, $minutes, 0, 1, 1, 2000); 21$minutes = date('i', $time); 22$hour = date('H', $time); 23 24// 実働計算 25if ($year != $data['year'] || $month != $data['month'] || $day = $data['day']) { 26$jitsudo = ($data['退勤'] - $data['出勤']) - ($data['休戻'] - $data['休入']) - ($data['待戻'] - $data['待入']); 27$data = []; 28} 29$data['year'] = $year; 30$data['month'] = $month; 31$data['day'] = $day; 32$data[$row['dakoku']] = $time; 33 34if ($jitsudo) : 35// 実働を時間表示 36$jitsudo = date('H:i', strtotime('-1 hours', $jitsudo)); 37?> 38 39// table表示 40<tr> 41<td colspan="4">実働 :<?= $jitsudo; ?></td> 42</tr> 43<tr> 44<td><?= h($row['name']); ?></td> 45<td><?= h($row['dakoku']); ?></td> 46<td><?= h($month) . '/' . h($day); ?></td> 47<td><?= h($hour) . ':' . h($minutes); ?></td> 48</tr> 49<?php endwhile; 50$jitsudo = ($data['退勤'] - $data['出勤']) - ($data['休戻'] - $data['休入']) - ($data['待戻'] - $data['待入']); 51$jitsudo = date('H:i', strtotime('-1 hours', $jitsudo)); 52<tr> 53<td colspan="4">実働 :<?= $jitsudo; ?></td> 54</tr>

こちらで教えていただきながら、一応このように書きました。
表示に関しては特に問題もなく、「一日分の実働」がその日の終わりのとこに表示されます。


ここから質問となります。
1.「一日分の実働」の一ヶ月分の合計を出したい。
$jitsudoをなんとか足して足してでいきたいのですが、そのロジックがわかりません。

2.これは、難しければいいのですが、、、
待機の条件に
○待戻 - 待入 = 30分未満だったら、計算しない又は0
を追加できますか?
例えば
○○さんのデータで、
出勤 9:00
休入 12:00
休戻 13:00
退勤 18:00
=実働 8:00
出勤 9:00
待入 10:00
待戻 11:00
休入 12:00
休戻 13:00
退勤 18:00
=実働 7:00
出勤 9:00
待入 10:00
待戻 10:20→30分未満なので0とする
休入 12:00
休戻 13:00
退勤 18:00
=実働 8:00
出勤 9:00
待入 10:00
待戻 10:20→30分未満なので0とする
休入 12:00
休戻 13:00
待入 15:00
待戻 15:30→30分以上なので計算する
退勤 18:00
=実働 7:30
// 1.の質問内容
合計実働 = 30:30

難しい内容かもしれませんが、どうかアドバイスいただけますでしょうか?
よろしくお願い致します。


[追記]
本当に理解力が乏しく、、、いろいろやってみているのですが、結局うまくいかず、、、こちらに追記させてください。。。

PHP

1$data = []; // $dataっていう配列の初期化 2$jitsudo = 0; // $jitsudoの初期値? 3if ($day = @data['day'] && $data) { // もしも、$dayがdata['day']と$dataだったら 4$jitsudo = 計算 // $jitsudoに計算式を入れる。 5$data = []; // 配列の初期化 6} 7 8$data['year'] = $year; 9$data['month'] = $month; 10$data['day'] = $day; 11$data[$row['dakoku']] = $time; // dakokuにmktimeした$timeを? 12 13if ($jitsudo) : // もし$jitsudoがあったら 14?> 15<tr> 16<td colspan="4">実働:<?= $jitsudo; ?></td> // 実働表示 17</tr> 18<?php 19$jitsudo = 0; 20endif; 21?> 22<tr> 23<td><?= h($row['name']); ?></td> // 名前表示 24<td><?= h($row['dakoku']); ?></td> // 打刻の種別 25<td><?= h($month) . '/' . h($day); ?></td> // 月/日 26<td><?= h($hour) . ':' . h($minutes); ?></td> // 時:分 27</tr> 28<?php 29endwhile; 30$jitsudo = 計算 31?> 32<tr> 33<td colspan="4">実働:<?= $jitsudo; ?></td> // 実働表示 34</tr> 35<?php 36$jitsudo = 0; 37endif; 38?>

流れとして
while内に計算と表示があって、while抜けてから最後の計算って流れなんですが、
while内では無いようにしたりとかしたり、してみたのですが、、、
どうなっているのか、よくわからなくなってしまい、、、、
手が詰まりました。。。。

待機のことなどは、特にあれば良いななので、ここでは実働の表示だけで大丈夫です。

レベルが低く申し訳ありません。。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

直接の回答じゃないけど、

  • データをそろえる処理
  • そろったデータを表示する

の2つに、明確に処理を分けたほうがよいですね。
前半は全部のデータを作っておくって感じ。

データ作りながらHTML表示、とかやってると、本当に混乱しますし、余計な不具合を誘発することにもなります。

投稿2016/03/22 06:01

ogaaaan

総合スコア765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Z-TALBO

2016/03/22 06:25

回答ありがとうございます。 確かに、ただでさえロジックがわからないのに、、、で混乱が余計訳わかんない混乱になってきています。。。 MVCなどの作り方とかが一番なのでしょうが、そこをまだ勉強してなくて、、、 コードをキレイにするというのも、まだとりあえず動作するかどうかのレベルなのですが、、、そういった部分も気をつけて見て行きたいと思います。
ogaaaan

2016/03/22 06:30

そっすねー、ざっくりと言うとMVCは - DB接続後にデータをいろいろ加工して、すべてのデータを変数で用意する がモデル、 - そのデータをHTMLで表示する がビューになりますね。
Z-TALBO

2016/03/22 06:35

ざっくりとの流れというか、モデルとかコントローラーとかってのは、おおまかにですが分かるんですけど、なんかこう、とりあえずやってみよう!って感じの参考になるサイトってありますかね? 当然知識がないといけないんですが、どうも知識ありきな感じがやはり多いので、、、
ogaaaan

2016/03/22 06:42 編集

そういうのは自分で探すものなのでカジュアルに聞くと怒られちゃうYO!!! (それに質問は1タイトルで1つにしておくべき) 一般的に技術者ってのは、自分でできることが無くなったら、そこで初めて人に聞く、という感じで覚えてきた人が多いので、開発力だけではなく、解決力も絶対に必要。 『失敗怖がって最初から成功しようとしてる!』『いいとこ取りしてる!』って思われてしまうと、そのうち相手にされなくなるので、まずは手を動かそう。 考えるよりそのほうが早いっす。 答えは検索結果にもあるし、書店にもあるよ。もちろんAmazonにもあるだろうね。
Z-TALBO

2016/03/22 06:44

そうですね。。。いろいろ見てみようと思います。 ちょっと質問の内容からだいぶそれてしまい申し訳ありませんでした。
KiyoshiMotoki

2016/03/22 06:44

> 開発力だけではなく、解決力も絶対に必要。 に同意します。
guest

0

ベストアンサー

条件が間違ってました。日が変わったとき&$dataが入っているとき実働時間を計算します。

PHP

1if ($year != $data['year'] || $month != $data['month'] || $day = $data['day']) { 23if ($day != @$data['day'] && $data) { 4```実働時間を表示するときに 5```PHP 6function sec_to_time($sec) { 7 return 8 floor($sec / 3600).":". 9 sprintf('%02d',floor(($sec / 60) % 60)); 10} 11```のような関数を作って自分で時間を表示しましょう。date関数はUTCからなので、日本では9時間ずれます。(9時間多くなる) 12 13また、30分ごとにするところですが、5分単位で丸めているんですから、そこを変えればいいのでは? 14そのあたりは、ご自分で考えてみてください。 15 16四捨五入は`round`ですが、切り捨ては`floor`です。

投稿2016/03/19 07:52

編集2016/03/19 08:42
shi_ue

総合スコア4437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Z-TALBO

2016/03/19 08:41

試した結果を追記で書きます
shi_ue

2016/03/19 08:51 編集

はたと見たら、いろいろ間違えてました。修正しました。 typoでした。 コピペだけでは、だめですよ!自分で仕組みを考えてくださいね。
Z-TALBO

2016/03/19 09:18

ちょっと、自分でいじってまたコメントいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問