كيف يمكنني إصلاح اليوم الأخير من أخطاء الشهر التي تؤدي إلى رمز PHP هذا؟

StackOverflow https://stackoverflow.com/questions/762106

  •  11-09-2019
  •  | 
  •  

سؤال

الرمز أدناه هو ما أستخدمه للحصول على قائمة موقع ويب يتحرك الرابط لصفحة الشهر الحالي إلى أعلى قائمة الرابط في تغيير الشهر.

لكن هذا فشل في 31 أشهر، مثل أبريل؛ أحصل على روابطين بنفس الشهر لمعظم الروابط. لقد قرأت من خلال المشكلات بالطريقة التي يولد بها PHP التواريخ، ولكن لا يمكن معرفة كيفية تغيير هذا الرمز.

أي شخص فب دكتوراه تريد أن تأخذ طعنة في ذلك؟ شكرا

<?php $month1 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+1 , date('d'), date('Y'))));
$month2 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+2 , date('d'), date('Y'))));
$month3 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+3 , date('d'), date('Y'))));
$month4 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+4 , date('d'), date('Y'))));
$month5 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+5 , date('d'), date('Y'))));
$month6 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+6 , date('d'), date('Y'))));
$month7 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+7 , date('d'), date('Y'))));
$month8 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+8 , date('d'), date('Y'))));
$month9 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+9 , date('d'), date('Y'))));
$month10 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+10 , date('d'), date('Y'))));
$month11 = (date('F', mktime(date('H'), date('i'), date('s'), date('m')+11 , date('d'), date('Y')))); ?>

<a href="http://mydomain.com/<?php echo strtolower(date('F')); ?>/" title="<?php echo ucfirst(date('F')); ?>"><?php echo (date('F')); ?></a><br />

<a href="http://mydomain.com/<?php echo strtolower($month1); ?>/" title="<?php echo $month1; ?>"><?php echo $month1; ?></a><br />

...(2 through 10)...

<a href="http://mydomain.com/<?php echo strtolower($month11); ?>/" title="<?php echo $month11; ?>"><?php echo $month11; ?></a><br />
هل كانت مفيدة؟

المحلول

<?php

$current_month = date('n');
$MONTHS = array();
for ($m=0; $m<12; $m++) {
  $display_month = $m + $current_month;
  $MONTHS[] = date('F',mktime(1,1,1,$display_month,1,date("Y")));
}
foreach ($MONTHS as $month) {
  echo "
    <a
      href=\"http://mydomain.com/".strtolower($month)."\"
      title=\"$month\">$month</a><br />";
}
?>

نصائح أخرى

يمكنك أن تنظر في استخدام strtotime () بدلا من mktime. منذ في strtotime () يمكن أن تفعل

strtotime("-1 day", time());

في الأول من شهر واحد وسيعود يوما ما بالضبط. حتى العد في سنوات القفزة.

استخدم 1 بدلا من التاريخ ('D') في التعليمات البرمجية الخاصة بك؛ ومع ذلك، في أي وقت ترى كود مكررة، حيث يتغير رقم فقط، يجب أن تفكر في الحلقات:

<?php
for ($i = 0; $i < 12; $i++) {
    $month = date('F', mktime(0, 0, 0, date('m') + $i, 1, date('Y')));
?>

    <a href="http://mydomain.com/<?php echo strtolower($month); ?>" title="<?php echo $month; ?>"><?php echo $month; ?></a><br />

<?php
}
?>

ليس لدي أي فكرة عما إذا كان هذا يحل مشكلتك، لأنني لست متأكدا من أن أفهم ما كانت المشكلة، لكن لدي فكرة عن كيفية جعل هذا الرمز أكثر قابلية للقراءة قليلا:

<?php 
    $month1 = date('F', strtotime("+1 month"));
    $month2 = date('F', strtotime("+2 month"));
    $month3 = date('F', strtotime("+3 month"));
    $month4 = date('F', strtotime("+4 month"));
    $month5 = date('F', strtotime("+5 month"));
    $month6 = date('F', strtotime("+6 month"));
    $month7 = date('F', strtotime("+7 month"));
    $month8 = date('F', strtotime("+8 month"));
    $month9 = date('F', strtotime("+9 month"));
    $month10 = date('F', strtotime("+10 month"));
    $month11 = date('F', strtotime("+11 month"));
?>

(لكنني أتفق أيضا مع ملاحظة تشاد بيرش حول استخدام الحلقات بدلا من تكرار الرمز)

<?php
    foreach(range(0,11) as $key){
        $months[$key]=date('F', strtotime("+{$key} month"));
    }
/* ... */
    foreach($months as $month){
        print "<a href='http://mydomain.com/".strtolower($month).
            "' title='".$month."'>".$month."</a><br />";
    }
?>

يا عزيزي، هذا بعض الكود القبيح. يجب أن تنظر حقا حلقات (ل / بينما / الخ) و صفائف.

يمكن تقليل الرمز الذي لديك هناك إليه:

تحريرها: كان الرمز الخاص بي نفس المشكلة مثل الأصل، ثابت باستخدام محلول scronide، شكرا لتشيره.

<?php
for ($i = 0; $i < 12; $i++)
{
    $months[$i] = date('F', mktime(0, 0, 0, date('m') + $i, 1, date('Y')));
}

for ($i = 0; $i < 12; $i++)
{
    print '<a href="http://mydomain.com/'.strtolower($months[$i]).'/" title="'.$months[$i].'">'.$months[$i]."</a><br />\n";
}
?>

أو إذا كنت لا تمانع في الجمع بين الوظيفتين (الحصول على أسماء الشهر، وطباعة الروابط) معا، ولا تحتاج إلى أسماء الشهر المخزنة لأي شيء آخر:

<?php
for ($i = 0; $i < 12; $i++)
{
    $month = date('F', mktime(0, 0, 0, date('m') + $i, 1, date('Y')));
    print '<a href="http://mydomain.com/'.strtolower($month)."/\" title=\"$month\">$month</a><br />\n";
}
?>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top