2012-10-29 22 views
5

मेरे पास एक जटिल कार्य है कि मैं कुछ दिनों के लिए दीवार के खिलाफ अपना सिर मार रहा हूं। मैंने लगभग 4 अलग-अलग दृष्टिकोणों की कोशिश की है, हालांकि प्रत्येक स्टॉल लगता है और यह बेहद निराशाजनक हो रहा है।अन्य समय सीमाओं में एक समय सीमा को विभाजित करें

मेरे पास समय सीमा है। उदाहरण के लिए, 14:30:00 से 18:30:00 तक। इस समय विचार करें किसी के काम की शिफ्ट को सीमित करें। इस समय सीमा के दौरान, वे कहते हैं कि वे 15:30:00 से 16:30:00 तक और 17:30:00 से 18:30:00 तक काम नहीं कर सकते हैं। मुझे विरोधाभासी बदलावों को हटाने के लिए मूल शिफ्ट की शुरुआत और समाप्ति समय को संशोधित करने की आवश्यकता है।

मूल पारी सरणी इस तरह दिखता है:

$original_shift[0]['start'] = '14:30:00'; 
$original_shift[0]['end'] = '18:30:00'; 

और समय इस तरह मूल बदलाव नज़र से निकाले जाने का पर्वतमाला:

:

$subshift[0]['start'] = '15:30:00'; 
$subshift[0]['end'] = '16:30:00'; 
$subshift[1]['start'] = '17:30:00'; 
$subshift[1]['end'] = '18:30:00'; 

यहाँ एक दृश्य है enter image description here

तो, मुझे मूल रूप से मेरी मूल शिफ्ट की आवश्यकता है इस तरह दिखेगा जब मेरा कार्य पूर्ण हो:

$original_shift[0]['start'] = '14:30:00'; 
$original_shift[0]['end'] = '15:30:00'; 
$original_shift[1]['start'] = '16:30:00'; 
$original_shift[1]['end'] = '17:30:00'; 

कुछ जटिलताओं कि मैं भी विचार करने की जरूरत हैं:

  1. इन समय सीमाओं किसी भी बार (आधे घंटे मैं के रूप में करने के लिए विवश नहीं किया जा सकता मेरे उदाहरण में प्रयोग किया जाता है), हालांकि मुझे 100% निश्चितता के साथ पता चलेगा कि अनुपलब्ध समय सीमाएं हमेशा मूल शिफ्ट की शुरुआत और अंत समय के बीच या उसके बीच समाप्त होती हैं।

  2. अनुपलब्ध समय बट हो सकता है और/या पूरे मूल शिफ्ट के समय को ले सकता है।

मैं "मेरे कोड लिखने" करने के लिए किसी के लिए नहीं देख रहा हूँ के रूप में ज्यादा मैं कोई है जो अतीत में कुछ इस तरह से निपटा गया है और वे इसे कैसे पूरा किया पर कुछ जानकारी हो सकता है के लिए देख रहा हूँ के रूप में।

+0

मैंने कुछ स्पष्टीकरण दिए हैं, हालांकि अंतिम कोड ब्लॉक यह नहीं दिखाता है कि यह कैसे करना है, यह दिखाता है कि मुझे उत्पादन के लिए अंतिम उत्पाद की आवश्यकता है। –

+0

मूल शिफ्ट को पहले से विभाजित किया जा सकता है, उदा। क्या इसमें पहले से ही अनुपलब्ध समय हो सकता है? – Gordon

उत्तर

3

जैसा कि आपने विशेष रूप से एक पूर्ण कामकाजी उत्तर के बजाय "कुछ अंतर्दृष्टि" के लिए कहा था, मैं व्यक्तिगत रूप से "मिनट" के साथ आबादी वाले एरे के साथ जाऊंगा।

$shift = array(
    'start' => '15:30:00', 
    'end' => '18:30:00', 

    'original' => array(), 
    'unavailable' => array(), 
    'modified' => array() 
); 

फिर आप कुछ बेबात 930 और 18:30:00 में 15:30:00 कन्वर्ट करने के लिए 1110 (मिनट की संख्या) जो आप प्रारंभ और समाप्ति समय के बीच अंतर दे देंगे में करना चाहते हैं।

उपयोग range() जल्दी से एक ऐसी ही प्रारूप में अपने unavailable में original सरणी, भार को भरने के लिए और उसके बाद array_intersect() और array_diff() जैसी चीजों का उपयोग बाहर काम करने के जो मूल बदलाव से कुछ ही मिनटों में उपलब्ध नहीं हैं।

उस से, modified सरणी बनाएं, और सीधे अपने आउटपुट में पढ़ें।

+0

धन्यवाद! कुछ कारणों से, यह मिनटों (एक पूर्णांक के रूप में) के साथ काम करने के लिए मेरे साथ कभी नहीं हुआ। मेरे पास वास्तव में पिछले चरण से मिनट-आधारित पूर्णांक में समय होता है, इसलिए यह मूल रूप से जो मैं कर रहा था उसके साथ अच्छा लगा। मैंने जो सुझाव दिया था उससे परे थोड़ा और काम के साथ समाधान के साथ आने में सक्षम था, लेकिन आपने मुझे सही विचार पथ पर रखने में मदद की। –

1

कोड खुद के लिए बात करनी चाहिए:

$original_shift[0]['start'] = '14:30:00'; 
$original_shift[0]['end'] = '18:30:00'; 

$breaks[0]['start'] = '14:30:00'; 
$breaks[0]['end'] = '15:30:00'; 
$breaks[1]['start'] = '16:30:00'; 
$breaks[1]['end'] = '17:30:00'; 

$modified_shift = array(
    array('start' => $original_shift[0]['start']) 
); 

for($x = 0, $y = count($breaks), $z = 0; $x < $y; $x++){ 
    $modified_shift[$z]['end'] = $breaks[$x]['start']; 
    if($modified_shift[$z]['end'] != $modified_shift[$z]['start']){ 
     $z++;  
    } 
    $modified_shift[$z]['start'] = $breaks[$x]['end']; 
} 

$modified_shift[$z]['end'] = $original_shift[0]['end']; 

if($modified_shift[$z]['end'] == $modified_shift[$z]['start']){ 
    unset($modified_shift[$z]); 
} 
2

आप समय-पर्वतमाला की गणना करने के लिए की जरूरत है। जैसा कि छवि दिखाता है यह एक साधारण घटाव की तरह लगता है। केवल उन वस्तुओं को रखना अच्छा होगा जो ये करते हैं।

मेरे पास इस तैयार के लिए कोई कोड नहीं था, इसलिए निम्न अवधारणा थोड़ा मोटा है हालांकि शायद वह बुरा नहीं है।

Range प्रकार जो समय-समय पर प्रदर्शित करता है। वे DateTime के रूप में हैं ताकि इन मौजूदा प्रकारों के लाभों का उपयोग किया जा सके। मैंने अब तक के अधिकांश लाभों का उपयोग नहीं किया है, हालांकि शेष आवेदन के लिए यह समझ में आता है।

Range प्रकार में पहले से ही कुछ बुनियादी तुलना विधियां शामिल हैं जो मैंने सोचा था कि गणना के कुछ हिस्सों को करने के लिए उपयोगी थे।

हालांकि एक वस्तु स्वयं को दो में विभाजित नहीं कर सकती है, मैंने एक Ranges प्रकार भी बनाया है जो एक या अधिक Range एस का प्रतिनिधित्व कर सकता है। यह कुछ ऐसा होना जरूरी था जिसे "विभाजित" किया जा सके।

मैंने यहां थोड़ा धोखा दिया क्योंकि मैंने Range के सदस्य के रूप में अंतर गणना लागू की, एक या एकाधिक Range ऑब्जेक्ट्स के साथ एक सरणी लौटा दी। अंतिम गणना तो बस एक पारी होने और इसे से अनुपलब्ध पर्वतमाला घटाना है:

$shift = new Ranges(new DateTime('14:30:00'), new DateTime('18:30:00')); 

$unavailables = new Ranges([ 
    new Range(new DateTime('15:30:00'), new DateTime('16:30:00')), 
    new Range(new DateTime('17:30:00'), new DateTime('18:30:00')), 
]); 

$shift->subtract($unavailables); 

पारी तो spans:

14:30:00 - 15:30:00 
16:30:00 - 17:30:00 

Demo; Gist

मैं नहीं कह सकता है अगर यह अमूर्त के लायक है, क्या DateTime वस्तुओं के साथ अच्छा है कि आप उन्हें >, < और = के साथ तुलना कर सकते हैं। रेंज और रेंज के बीच अधिक गणना की आवश्यकता होने पर इन वर्गों से वास्तविक लाभ प्रकाश में पड़ सकता है। हो सकता है कि इंटरफ़ेस अभी तक मीठा नहीं है, हालांकि पीछे की मूल गणना पहले से ही कोड में उल्लिखित है।

एक चेतावनी: 14:00-15:00 और 14:00-15:00 के बीच का अंतर मेरे कोड में 14:00-14:00 होगा। मैं प्रारंभ समय को खाली नहीं चलाने के लिए रखता हूं, लेकिन आप खाली भी चला सकते हैं। रेंज ऑब्जेक्ट को इसे अच्छी तरह से संभालना चाहिए।

+0

व्यस्त संचालन के लिए कुछ त्रुटियां थीं, मैंने गिस्ट को अपडेट किया, और एक अपडेटेड डेमो यहां है: http://codepad.viper-7.com/jy2Uz5 – hakre

+0

धन्यवाद, यह कोड बहुत ही आशाजनक दिखता है। मैं शायद इसे उत्तर के रूप में स्वीकार कर लेता था (जब संभव हो तो मैं डेटटाइम पसंद करता हूं), हालांकि एक अग्रदूत (और जो कुछ मैंने छोड़ा था) यह है कि इससे पहले कदम, मैं इसे सीधे मिनटों में बदल रहा था (उदाहरण के लिए 480 के लिए 480) एक डेटटाइम ऑब्जेक्ट। जो के समाधान ने नीचे दिए गए समय के एकमात्र संस्करण के साथ सीधे काम करने का सुझाव दिया, जो किसी भी तरह से मेरे साथ कभी नहीं हुआ। उनका समाधान काम करता है और मुझे एक कदम बचाता है, यही कारण है कि मैं उसका उत्तर चुनने का चयन कर रहा हूं। आपके द्वारा इस उत्तर में किए गए काम के लिए बहुत बहुत धन्यवाद! –

+0

आंतरिक रूप से यह चीज एक सरणी है, हालांकि, मैं प्रारंभ/अंत तुलना करके संख्याओं (एक तत्व प्रति मिनट) की श्रेणियों को रखने के लिए छोड़ देता हूं। यह समान रूप से मिनट की शुरुआत और अंत मूल्यों के साथ काम करेगा और मैंने इन श्रेणियों को और अधिक सार बनाने के बारे में सोचा था क्योंकि मैं एक बार (समय आधारित नहीं) की कुछ समान आवश्यकता थी।इसे लिखना मजेदार था, यह भी बहुत तेज़ किया गया है, मैं विधियों के नाम से पूरी तरह से संतुष्ट नहीं हूं। लेकिन अगर आप सरणी के साथ काम करते हैं तो भी मैं कोड को दुबला रखने के लिए सीमा और विधियों को एक साथ रखने के लिए इसका मूल प्रकार बनाने का सुझाव देता हूं। आपकी परियोजना के लिए शुभकामनाएं। – hakre

संबंधित मुद्दे