दिलचस्प पोस्ट
क्या `लम्बी 'कम से कम 32 बिट्स होने की गारंटी है? शून्य मुख्य और इंट मुख्य के बीच का अंतर? सीएसएस अतिप्रवाह-एक्स: दृश्यमान; और अतिप्रवाह- y: छिपा हुआ; स्क्रॉलबार समस्या पैदा करने के कारण C ++ पॉइंटर के लिए डिफ़ॉल्ट कन्स्ट्रक्टर क्या है? डीएएल -> बीएलएल <- जीयूआई + संरचना रूट डीआई-बाइंडिंग सेटअप कैसे करें? एंड्रॉइड कैसे ImageView पर मुखौटा लागू करने के लिए? SQL सर्वर 2008 एक्सप्रेस की स्थानीय आवृत्ति से कनेक्ट करने के लिए कैसे करें C ++ में मुझे cin.ignore () का उपयोग कब और क्यों करना है? टेस्टिंग टेक्स्ट () XPath में नोड्स बनाम स्ट्रिंग मान सी ++: क्लास डेटा सदस्य को पॉइंटर ":: *" सी में, एरे पॉइंटर्स हैं या पॉइंटर्स के रूप में इस्तेमाल किया जाता है? iphone रिबूट प्रोग्रामेटिक रूप से jQuery – आग घटना अगर सीएसएस वर्ग बदल गया है माउस का उपयोग करके HTML5 कैनवास पर ड्रा बनाएं गिट में एक फ़ाइल की कॉपी संशोधनों को वापस लाएं?

एक सेट में लगातार तिथियों की जांच करें और श्रेणी के रूप में लौटें

मेरे पास तिथियों के सरणियां हैं जो वाईएमडी प्रारूप हैं जो कि दस दिन की तारीखों के किसी भी संयोजन हो सकते हैं जो एक दिन अलग हैं।

उदाहरण यहाँ पूर्ण सेट है:

2011-01-01, 2011-01-02, 2011-01-03, 2011-01-04, 2011-01-05, 2011-01-06, 2011-01-07, 2011-01-08, 2011- 01-09, 2011-01-10

उस सेट से बनाए गए arrays तारीखों का कोई भी संयोजन हो सकता है- उनमें से सभी, इनमें से एक, कुछ लगातार, लगातार सभी, आदि।

मैं वर्तमान में उन्हें बहुत ज्यादा प्रिंट कर रहा हूं क्योंकि वे लौटे हैं उदाहरण यहाँ एक संभावित परिणाम है:

2011-01-02

2011-01-03

2011-01-04

2011-01-08

(वास्तव में क्या मुद्रित किया गया है "शुक्रवार, जनवरी 2 …" जैसा है, लेकिन हम साधारण तिथि स्ट्रिंग के साथ रहेंगे)

मैं इसे संक्षेप करना चाहता हूं ताकि यदि तीन या अधिक लगातार दिन हो, तो यह एक श्रेणी बन जाती है, उदाहरण के लिए ऊपर दिए गए उदाहरण होंगे:

2011-01-02 से 2011-01-04

2011-01-08

जो अंततः बन जाएगा:

रविवार, जनवरी 2 – मंगलवार, 4 जनवरी

शनिवार जनवरी 8

क्या लूप का एक तरीका है और समय के अंतर की जांच, श्रेणी (ओं) के लिए एक प्रारंभ समय और समाप्ति समय बनाएं, और फिर स्ट्रैगर्स को इकट्ठा करें?

वेब के समाधान से एकत्रित समाधान "एक सेट में लगातार तिथियों की जांच करें और श्रेणी के रूप में लौटें"

त्वरित जवाब के बिट को कार्यान्वयन की कमी के बारे में तो खेद है, लेकिन मान लें कि आप 5.3 का उपयोग कर रहे हैं और दिनांक को कालानुक्रमिक रूप से क्रम दिया गया है, आप प्रत्येक दिनांक को DateTime ऑब्जेक्ट में परिवर्तित कर सकते हैं (यदि वे पहले से नहीं हैं) और फिर DateTime::diff() एक DateInterval ऑब्जेक्ट उत्पन्न करने के लिए जो कि आप पिछले दिनांक के साथ चलने की वर्तमान तिथि की तुलना करने के लिए उपयोग कर सकते हैं। आप उप-सरणियों में अपनी लगातार तारीखों को समूहित कर सकते हैं और उस उप-सरणी में पहले और अंतिम दिनों के लिए shift() और pop() कर सकते हैं

संपादित करें

इस बारे में मुझे एक विचार था बहुत कठिन और तैयार कार्यान्वयन इस प्रकार है, लेकिन यह काम करना चाहिए:

 // assuming a chronologically // ordered array of DateTime objects $dates = array( new DateTime('2010-12-30'), new DateTime('2011-01-01'), new DateTime('2011-01-02'), new DateTime('2011-01-03'), new DateTime('2011-01-06'), new DateTime('2011-01-07'), new DateTime('2011-01-10'), ); // process the array $lastDate = null; $ranges = array(); $currentRange = array(); foreach ($dates as $date) { if (null === $lastDate) { $currentRange[] = $date; } else { // get the DateInterval object $interval = $date->diff($lastDate); // DateInterval has properties for // days, weeks. months etc. You should // implement some more robust conditions here to // make sure all you're not getting false matches // for diffs like a month and a day, a year and // a day and so on... if ($interval->days === 1) { // add this date to the current range $currentRange[] = $date; } else { // store the old range and start anew $ranges[] = $currentRange; $currentRange = array($date); } } // end of iteration... // this date is now the last date $lastDate = $date; } // messy... $ranges[] = $currentRange; // print dates foreach ($ranges as $range) { // there'll always be one array element, so // shift that off and create a string from the date object $startDate = array_shift($range); $str = sprintf('%s', $startDate->format('D j M')); // if there are still elements in $range // then this is a range. pop off the last // element, do the same as above and concatenate if (count($range)) { $endDate = array_pop($range); $str .= sprintf(' to %s', $endDate->format('D j M')); } echo "<p>$str</p>"; } 

आउटपुट:

 Thu 30 Dec Sat 1 Jan to Mon 3 Jan Thu 6 Jan to Fri 7 Jan Mon 10 Jan