आगामी द्वारा आदेश दिनांक

वोट
3

तो मैं विभिन्न तारीखों की एक सरणी का निर्माण। जन्मदिन, वर्षगाँठ, और छुट्टियों। मैं सरणी है जिसके द्वारा एक अगले हो रहा है ऑर्डर करना है, अनिवार्य रूप से सॉर्ट अक्टूबर सितंबर को (अगले वर्ष के लिए लपेटकर)

यदि ऐसा है तो मेरी सरणी है

$a = ([0]=>1980-04-14, [1]=>2007-06-08, 
  [2]=>2008-12-25, [3]=>1978-11-03)

मैं इसे क्रमित करना चाहते हैं तो यह व्यवस्था की जाती है

$a = ([0]=>1978-11-03, [1]=>2008-12-25, 
  [2]=>1980-04-14, [3]=>2007-06-08)

क्योंकि नवंबर घटना 'एक है कि अगले क्या होगा (यह अक्टूबर जा रहा है अभी के आधार पर) है।

मैं usort कोशिश कर रहा हूँ जहाँ मेरे सीएमपी समारोह है

function cmp($a, $b)
{
  $a_tmp = split(-, $a);
  $b_tmp = split(-, $b);
  return strcmp($a_tmp[1], $b_tmp[1]);
} 

मुझे यकीन है कि यह कैसे को संशोधित करने के लिए अपने वांछित प्रभाव प्राप्त करने के लिए नहीं कर रहा हूँ।

03/10/2008 को 18:21
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


6 जवाब

वोट
-1

तार की तुलना न करें, बल्कि के बाद से 1970 (ints) सेकंड का उपयोग करें:

$date1 = split("-", $a);
$date2 = split("-", $b);
$seconds1 = mktime(0,0,0,$date1[1],$date1[2],$date1[0]);
$seconds2 = mktime(0,0,0,$date2[1],$date2[2],$date2[0]);
// eliminate years
$seconds1 %= 31536000;
$seconds2 %= 31536000;
return $seconds1 - $seconds2;

इसके अलावा मैं PHP पता नहीं है, लेकिन मुझे लगता है कि सार सही है।

संपादित करें: तुलना समारोह तुलना, ज्यादा कुछ नहीं प्रदर्शन करने के लिए समझाया जाता है। मूल प्रश्न के संबंध में एक सूची ऑर्डर करने के लिए तरह आज की तारीख के साथ एक सरणी शामिल, सरणी में आज की तारीख का पता लगाने, और फिर स्थिति से आरोही क्रम में समाप्त करने के लिए है कि स्थिति से पहले तत्वों को स्थानांतरित।

03/10/2008 को 18:30
का स्रोत उपयोगकर्ता

वोट
1

मैं घटना के मूल साल की स्थापना, और फिर इसे करने के लिए पर्याप्त पूरे साल जोड़ने के लिए सुनिश्चित करें कि मूल्य आपके संदर्भ तिथि (सामान्य रूप से आज की तारीख) से अधिक है करने के लिए परीक्षा की जाएगी। या, संभवतः, संदर्भ तारीख करने के लिए बराबर या उससे अधिक। तुम तो सरल तारीख क्रम में सॉर्ट कर सकते हैं।

जोड़ने के लिए संपादित किया गया :

मैं काफी PHP में धाराप्रवाह है कि में एक जवाब देने के लिए नहीं कर रहा हूँ, लेकिन यहाँ एक पर्ल समाधान है।

#!/bin/perl -w

# Sort sequence of dates by next occurrence of anniversary.
# Today's "birthdays" count as low (will appear first in sequence)

use strict;

my $refdate = "2008-10-05";

my @list = (
    "1980-04-14", "2007-06-08",
    "2008-12-25", "1978-11-03",
    "2008-10-04", "2008-10-05",
    "2008-10-06", "2008-02-29"
);

sub date_on_or_after
{
    my($actdate, $refdate) = @_;
    my($answer) = $actdate;
    if ($actdate lt $refdate)   # String compare OK with ISO8601 format
    {
        my($act_yy, $act_mm, $act_dd) = split /-/, $actdate;
        my($ref_yy, $ref_mm, $ref_dd) = split /-/, $refdate;
        $ref_yy++ if ($act_mm < $ref_mm || ($act_mm == $ref_mm && $act_dd < $ref_dd));
        $answer = "$ref_yy-$act_mm-$act_dd";
    }
    return $answer;
}

sub anniversary_compare
{
    my $r1 = date_on_or_after($a, $refdate);
    my $r2 = date_on_or_after($b, $refdate);
    return $r1 cmp $r2;
}

my @result = sort anniversary_compare @list;

print "Before:\n";
print "* $_\n" foreach (@list);
print "Reference date: $refdate\n";
print "After:\n";
print "* $_\n" foreach (@result);

यह कुशल, आप date_on_or_after () मान एक बार की गणना होगी तरह उन मूल्यों पर बनाने के लिए, और फिर - जाहिर है, इस dreadfully कुशल नहीं है। पर्ल के तुलना में थोड़ा अजीब है - चर $ एक और $ ख जादू कर रहे हैं, और के रूप में यदि कहीं से दिखाई देते हैं।

जब चलाने के लिए, स्क्रिप्ट का उत्पादन:

Before:
* 1980-04-14
* 2007-06-08
* 2008-12-25
* 1978-11-03
* 2008-10-04
* 2008-10-05
* 2008-10-06
* 2008-02-29
Reference date: 2008-10-05
After:
* 2008-10-05
* 2008-10-06
* 1978-11-03
* 2008-12-25
* 2008-02-29
* 1980-04-14
* 2007-06-08
* 2008-10-04

ध्यान दें कि यह काफी हद तक क्या, फरवरी के 29 वें के साथ होता है, क्योंकि यह 'काम करता है' के मुद्दे बतख ऐसा करने के लिए। असल में, यह तिथि '2009/02/29, जो क्रम में सही ढंग से तुलना उत्पन्न होगा। (यदि 2000/02/28 डेटा में शामिल थे) 2000/02/28 के लिए सालगिरह 2008-02-29 के लिए सालगिरह से पहले सूचीबद्ध किया जाएगा।

03/10/2008 को 18:33
का स्रोत उपयोगकर्ता

वोट
0

तो यह मेरे लिए हुआ तो बस किसी भी महीने है कि मेरे लक्ष्य महीने से भी कम है 12 जोड़ने के लिए। जो अब काम कर रहा है।

इसलिए अंतिम समारोह

function cmp($a, $b)
{
$a_tmp = explode("-", $a["date"]);
$b_tmp = explode("-", $b["date"]);
if ($a_tmp[1] < date("m"))
{
  $a_tmp[1] += 12;
}
if ($b_tmp[1] < date("m"))
{
  $b_tmp[1] += 12;
}
return strcmp($a_tmp[1] . $a_tmp[2], $b_tmp[1] . $b_tmp[2]);
} 
03/10/2008 को 18:34
का स्रोत उपयोगकर्ता

वोट
3

function relative_year_day($date) {
    $value = date('z', strtotime($date)) - date('z');

    if ($value < 0)
        $value += 365;

    return $value;
}

function cmp($a, $b)
{
    $aValue = relative_year_day($a);
    $bValue = relative_year_day($b);

    if ($aValue == $bValue)
        return 0;

    return ($aValue < $bValue) ? -1 : 1;
}

$a = array("1980-04-14", "2007-06-08",
    "2008-12-25", "1978-11-03");

usort($a, "cmp");
03/10/2008 को 18:49
का स्रोत उपयोगकर्ता

वोट
0

strtotime () का उपयोग एक टाइमस्टैम्प करने के लिए सभी तिथियों कन्वर्ट करने के लिए इससे पहले कि आप उन्हें सरणी में जोड़ने के लिए है, तो आप आरोही में सरणी (भी कालानुक्रमिक) आदेश सॉर्ट कर सकते हैं। अब तुम सब करने की है अतीत में दिनांक जो आसानी से उन्हें एक वर्तमान टाइमस्टैम्प के खिलाफ की तुलना द्वारा किया जाता है के साथ सौदा है

अर्थात

for ($i=0; $i<count($a); $i++){
  if ($currentTimestamp > $a[$i]){
    unset($a[$i]);
  }
}
03/10/2008 को 18:51
का स्रोत उपयोगकर्ता

वोट
0

कोई कारण नहीं पहिया बदलने की। आप कुंजी के बारे में परवाह नहीं है, तो आप इस का उपयोग कर सकते हैं।

$a = array_combine(array_map('strtotime', $a), $a);
ksort($a);

या आप अपनी खुद की कॉलबैक परिभाषित करना चाहते हैं।

function dateCmp($date1, $date2) {
  return (strtotime($date1) > strtotime($date2))?1:-1;
}

usort($a, 'dateCmp');

आप जुड़े कुंजी रखने के लिए सही ढंग से चाहते हैं, बस के बजाय uasort कहते हैं।

uasort($a, 'dateCmp');

मैं एक त्वरित गति की जांच और कॉलबैक कार्यों एक परिमाण धीमी थे किया था।

07/10/2008 को 20:48
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more