मैं एक समारोह बना रहा हूँ जहाँ आप एक प्रारंभिक वर्ष, महीना और अंत वर्ष, महीना दे सकते हैं और समारोह हर महीने और साल में दो दिए गए बिंदुओं के बीच प्रिंट होगा।

मैंने पहले ही एक फ़ंक्शन बना लिया है जो पूरी तरह से काम करता है लेकिन मेरा मानना ​​है कि यह एक अच्छा अभ्यास नहीं है और ऐसा करने का बेहतर तरीका हो सकता है। अब मैं एक बेहतर तरीका खोजने के लिए आपकी मदद मांग रहा हूं।

पी.एस. मुझे इनपुट के रूप में पूरी तारीख नहीं मिल रही है। केवल माह संख्या और वर्ष प्राप्त कर सकते हैं।

यहाँ मेरा कोड है -

function get_all_months($monthstart = null, $yearstart = null, $monthend = null, $yearend = null) {
if (($monthstart === null) || ($yearstart === null) || ($monthend === null) || ($yearend === null)) {
    $monthend = date('m');
    $yearend = date('Y');
    if($monthend < 6) {
        $yearstart = $yearend - 1;
        $monthstart = (($monthend - 5) + 12);
    } else {
        $yearstart = $yearend;
        $monthstart = $monthend - 5;
    }
}
$month_array = array();
if ($yearstart > $yearend) {
    for ($m=$monthend; $m<=12; $m++) $month_array[] = array('month' => $m, 'year' => $yearend);
    for ($y=$yearend+1; $y<$yearstart; $y++) for ($m=1; $m<=12; $m++) $month_array[] = array('month' => $m, 'year' => $y);
    for ($m=1; $m<=$monthstart; $m++) $month_array[] = array('month' => $m, 'year' => $yearstart);
} elseif ($yearend > $yearstart) {
    for ($m=$monthstart; $m<=12; $m++) $month_array[] = array('month' => $m, 'year' => $yearstart);
    for ($y=$yearstart+1; $y<$yearend; $y++) for ($m=1; $m<=12; $m++) $month_array[] = array('month' => $m, 'year' => $y);
    for ($m=1; $m<=$monthend; $m++) $month_array[] = array('month' => $m, 'year' => $yearend);
} else {
    for ($m=$monthstart; $m<=$monthend; $m++) $month_array[] = array('month' => $m, 'year' => $yearstart);
}
return $month_array;
}

संपादित करें: निगेल रेन के उत्तर के आधार पर, यह सबसे अच्छा तरीका है जिसके बारे में मैं सोच सकता हूं -

 function get_all_months($monthstart = null, $yearstart = null, $monthend = null, $yearend = null) {

if (($monthstart === null) || ($yearstart === null) || ($monthend === null) || ($yearend === null)) {
    $monthend = date('m');
    $yearend = date('Y');
    if($monthend < 6) {
        $yearstart = $yearend - 1;
        $monthstart = (($monthend - 5) + 12);
    } else {
        $yearstart = $yearend;
        $monthstart = $monthend - 5;
    }
}

$output = [];

if ($yearstart > $yearend) {
    $time   = strtotime($yearend."-".$monthend);
    $last   = date('m-Y', strtotime($yearstart."-".$monthstart));
} else {
    $time   = strtotime($yearstart."-".$monthstart);
    $last   = date('m-Y', strtotime($yearend."-".$monthend));
}
do {
        $cur_month_year = date('m-Y', $time);
        $month = date('m', $time);
        $year = date('Y', $time);
        $output[] =  array('month'=>$month,'year'=>$year);
        $time = strtotime('+1 month', $time);
    }
    while ($cur_month_year != $last);
    return $output;
}
php
0
b0xed 18 अगस्त 2020, 21:41

5 जवाब

सबसे बढ़िया उत्तर

उत्तर के आधार पर यहां, इसे शुरू होने की तारीख में सिर्फ 1 महीना जोड़कर किया जा सकता है जब तक कि आप आखिरी तारीख तक नहीं पहुंच जाते ...

function get_all_months($monthstart = null, $yearstart = null, $monthend = null, $yearend = null) {
    $output = [];
    $time   = strtotime($yearstart."-".$monthstart);
    $last   = date('m-Y', strtotime($yearend."-".$monthend));
    do {
        $month = date('m-Y', $time);
        $output[] =  $month;
        $time = strtotime('+1 month', $time);
    }
    while ($month != $last);
    return $output;
}

इसलिए

print_r(get_all_months(4,2008,2,2010));

देता है...

Array
(
    [0] => 04-2008
    [1] => 05-2008
    [2] => 06-2008
    [3] => 07-2008
    [4] => 08-2008
    [5] => 09-2008
    [6] => 10-2008
    [7] => 11-2008
    [8] => 12-2008
    [9] => 01-2009
    [10] => 02-2009
    [11] => 03-2009
    [12] => 04-2009
    [13] => 05-2009
    [14] => 06-2009
    [15] => 07-2009
    [16] => 08-2009
    [17] => 09-2009
    [18] => 10-2009
    [19] => 11-2009
    [20] => 12-2009
    [21] => 01-2010
    [22] => 02-2010
)
1
Nigel Ren 18 अगस्त 2020, 22:11

DateTime वर्ग और DateInterval, आप एक जनरेटर निर्दिष्ट सीमा के डेटटाइम ऑब्जेक्ट का:

<?php

function get_all_months(int $monthstart, int $yearstart, int $monthend, int $yearend) {
        $onemonth = new DateInterval('P1M'); // one month interval
        $timeperiod = new DatePeriod(
                DateTime::createFromFormat('Y-m', "{$yearstart}-{$monthstart}"),
                $onemonth,
                DateTime::createFromFormat('Y-m', "{$yearend}-{$monthend}")->add($onemonth)
        );
        foreach ($timeperiod as $pos) {
                yield clone $pos;
        }
}

foreach (get_all_months(12, 2009, 1, 2020) as $month) {
        echo "{$month->format('Y-m')}\n";
}

डेटटाइम सादे स्ट्रिंग या संख्या सरणी की तुलना में उपयोग करने के लिए अधिक लचीला होना चाहिए (देखें DateTime:: प्रारूप अधिक उपयोग विकल्पों के लिए)।


नोट: @keidakida से प्रेरित होकर, मेरे उत्तर को अपडेट कर दिया।

0
Koala Yeung 18 अगस्त 2020, 22:42

अगर मैं सही ढंग से समझूं - आपको महीने को एक संख्या के रूप में और वर्ष को एक संख्या के रूप में मिलता है जैसे कि 6 और 1997। यदि हम मानते हैं कि प्रारंभ वर्ष हमेशा अंतिम वर्ष से कम होता है, तो मैं इस तरह जाने का सुझाव दूंगा।

function distanceBetweenDates(int $sm, int $sy, int $em, int $ey) {
    $monthsBetweenYears = ($ey - $sy + 1) * 12;
    $distanceBetweenMonths = $monthsBetweenYears - $sm - (12 - $em);
    
    $startMonth = $sm + 1;
    $startYear = $sy;
    
    while ($distanceBetweenMonths > 0) {
        if ($startMonth <= 12) {
            echo $startMonth . ' - ' . $startYear;
        } else {
            $startMonth = 1;
            $startYear++;
            echo $startMonth . ' - ' . $startYear;
        }
        echo "\n";
        $startMonth++;
        $distanceBetweenMonths--;
    }
}

आपको केवल यह देखने की आवश्यकता हो सकती है कि क्या दिए गए महीनों को शामिल किया गया है या गणना से बाहर रखा गया है।

यहां केवल एक चीज गायब है, वह है सत्यापन क्योंकि यदि आप विधि के अंदर प्रकारों का उपयोग करते हैं तो इसे एक प्रकार का "छोड़ा" जा सकता है।

0
g9m29 18 अगस्त 2020, 22:03

शायद आप इस तरह कुछ ढूंढ रहे हैं:

function get_all_months($monthstart = null, $yearstart = null, $monthend = null, $yearend = null) {
    $month_array = [];
    if ($yearstart == $yearend)
        for ($m=$monthstart; $m<=$monthend; $m++) $month_array[] = array('month' => $m, 'year' => $yearstart);
    else {
        for ($m=$monthstart; $m<=12; $m++) $month_array[] = array('month' => $m, 'year' => $yearstart);
        for ($y=$yearstart+1; $y<$yearend; $y++) for ($m=1; $m<=12; $m++) $month_array[] = array('month' => $m, 'year' => $y);
        for ($m=1; $m<=$monthend; $m++) $month_array[] = array('month' => $m, 'year' => $yearend);
    }
    return $month_array;
}
1
Iłya Bursov 18 अगस्त 2020, 21:51

आप PHP के DateInterval वर्ग का उपयोग कर सकते हैं जिसका उपयोग इन उद्देश्यों के लिए किया जाता है। इस कोड को आजमाएं

<?php
function getMonthsFromRange($start, $end, $format = 'M Y')
{

    $array = array();

    // Since you wanted 1 month it is Period = 1 Month
    $interval = new DateInterval('P1M');

    $realEnd = new DateTime($end);
    $realEnd->add($interval);

    $period = new DatePeriod(new DateTime($start), $interval, $realEnd);

    // Use loop to store date into array 
    foreach ($period as $date)
        $array[] = $date->format($format);

    // Return the array elements 
    return $array;
}

// Function call with passing the start date and end date 
$months = getMonthsFromRange('2010-10', '2011-11');

print_r($months);

इसका आउटपुट है:

Array ( [0] => Oct 2010 [1] => Nov 2010 [2] => Dec 2010 [3] => Jan 2011 [4] => Feb 2011 [5] => Mar 2011 [6] => Apr 2011 [7] => May 2011 [8] => Jun 2011 [9] => Jul 2011 [10] => Aug 2011 [11] => Sep 2011 [12] => Oct 2011 [13] => Nov 2011 )
2
keidakida 18 अगस्त 2020, 22:25