2

月曜日に2つのタイムブロックで働く2人の従業員がいます。1日のセグメント(夕方、午後、朝)ごとに分類された予定を作成する簡単な方法をクライアントに提供したいと思います。

- Morning: 0001 to 1200
- Afternoon: 1201 to 1600
- Evening: 1601 to 2400

月曜日から金曜日のスケジュール
ジョンの仕事:午前7時から午後1時
マイケルの仕事:午後1時から午後7時

土曜日のスケジュール
ジョンの仕事:午前8時から午後12時

月-金には、朝、午後、夕方のボタンが表示されます。土曜日は朝ボタンのみを表示する必要があります。

ジョンのスケジュールは午後に終了するため、これを実現する方法がわかりません。だから私は、時間範囲が別の時間範囲内にあるかどうかを確認し、ブール値か何かを返す方法を考えています。

http://screencloud.net/img/screenshots/123e673cdad3ea47337d512f6ef2fddc.png
私はすべてを開始時間ブロックと終了時間ブロックに分割しようとしていましたが、成功しました。しかし、それらを時刻(夕方、午後、朝)と比較するときが来たとき、私はそれらを比較する方法を知りませんでした。

私はあなたたちに私のコードを書かせようとしているので外れたくありません、私は論理の助けが必要です。スクリーンショットからわかるように、これは、この小さいが大きい部分を除いて、すでにすべて書かれています。どんなアイデアでも大歓迎です!

[解決]

私はEloquentと呼ばれるLaravelphpフレームワークのORMを使用しています。<3 *注:range(1201、1600、5)を実行すると混乱し、range(1200、1600)を実行すると大量のメモリが消費されるため、5ずつ増やしました。

                $day_segments = array(
                    "morning" => range(0, 1200, 5),
                    "afternoon" => range(1200, 1600, 5),
                    "evening" => range(1600, 2400, 5)
                );

                // On what days of the week are users working and in what time ranges?
                $user_timeranges = array();
                foreach ($record->users()->get() as $user) {
                    foreach ($user->timeblocks as $timeblock) {
                        $start_range = date('Hi', strtotime("{$timeblock->start_hour} {$timeblock->start_divide}"));
                        $end_range = date('Hi', strtotime("{$timeblock->end_hour} {$timeblock->end_divide}"));

                        $user_timeranges[$timeblock->day][] = range($start_range, $end_range, 5);
                    }
                }

                // On each day what day segments are available to create appointments?
                $available_segments = array();
                foreach ($days_available as $day) {
                    $available_segments[$day] = array();
                    foreach ($day_segments as $name => $segment) {
                        $available_segments[$day][$name] = 0;
                        foreach ($user_timeranges[$day] as $timerange) {
                            if (array_intersect($segment, $timerange)) {
                                $available_segments[$day][$name]++;
                            }
                        }
                    }
                }

                vardump($available_segments);
                exit;
4

1 に答える 1

2

あなたは丸1時間だけで行っているように見えるので、range()関数を使って各セグメントを定義することができ、同様に各ワーカーに対しても同様です。次に、使用array_intersectして、結果が得られるかどうかを確認します。

例:

$times = Array("morning"=>range(0,12),"afternoon"=>range(12,16),"evening"=>range(16,24));
$people = Array("John"=>range(7,13),"Michael"=>range(13,19));
$available = Array();
foreach($times as $k=>$v) {
    $available[$k] = 0;
    foreach($people as $name=>$times) {
        if( array_intersect($v,$times)) $available[$k]++;
    }
}
var_dump($available);
于 2012-12-17T16:44:22.590 に答える