如何从PHP中的数组+打印名称获取最接近的生日日期

时间:2017-04-09 18:21:14

标签: php arrays

大约2周前开始使用PHP,遇到第一个问题= D

无法确定如何完成任务。

程序必须提供下一个即将到来的生日和名字。谢谢提前

如何使这个程序打印出类似的东西:

Jessy Pinkmann 2017-09-11

<?php

$today=new DateTime();


$Bdays = array
(
    array("Lucienne Adkisson",date_create("2017-10-17")),            //0    //  Y/M/D
    array("Sheryll Nestle",date_create("2017-02-16")),            //1
    array("Tim Pittman",date_create("2017-07-29")),           //2
    array("Elmer Letts",date_create("2017-12-01")),                 //3
    array("Gino Massengale",date_create("2017-04-16")),              //4
    array("Jeremy Wiggs ",date_create("2017-09-17")),            //5
    array("Julian Bulloch ",date_create("2017-06 -21")),             //6
    array("Joella Hinshaw  ",date_create("2017-06-25")),                //7
    array("Mamie Burchill  ",date_create("2017-11-15")),                    //8
    array("Constance Segers  ",date_create("2017-06-30")),                //9
    array("Jessy Pinkmann",date_create("2017-09-11")),             //10
    array("Dudley Currie",date_create("2017-02-10"))             //11
);


for ($x =0; $x <= 11; $x++ ){


$diff=date_diff($today,$Bdays[$x][1]);
echo $diff->format("  %R%a");

}

?>

4 个答案:

答案 0 :(得分:1)

我重新构建了一些代码。

<?php
$today = date("Y-m-d");

$Bdays = array
(
    array("Lucienne Adkisson", "2017-10-17"),
    array("Sheryll Nestle", "2017-02-16"),
    array("Tim Pittman", "2017-07-29"),
    array("Elmer Letts", "2017-12-01"),
    array("Gino Massengale", "2017-04-16"),
    array("Jeremy Wiggs", "2017-09-17"),
    array("Julian Bulloch", "2017-06 -21"),
    array("Joella Hinshaw", "2017-06-25"),
    array("Mamie Burchill", "2017-11-15"),
    array("Constance Segers", "2017-06-30"),
    array("Jessy Pinkmann", "2017-09-11"),
    array("Dudley Currie", "2017-02-10")
);


$tmp = 366;
$closest = ["", 0];
for ($i = 0; $i < count($Bdays); $i++)
{
    if (abs(strtotime($today) - strtotime($Bdays[$i][1])) / 86400 < $tmp)
    {
        $tmp = abs(strtotime($today) - strtotime($Bdays[$i][1])) / 86400;
        $closest = [$Bdays[$i][0], $Bdays[$i][1]];
    }
}
?>

$tmp设置为无值,为366天。这是将最近日期存储到今天日期的变量。我还更改了for循环以使用count function,这意味着如果您向$Bdays添加更多日期,那么它将为for循环迭代更多次。

$closest存储与今天最近的日期的名称和生日。

abs function会将负数转换为正数。这是因为如果你有-138的差异,那么这将小于38,即使这意味着日期距离100天更远,只是因为负数是低。

更新

我已经更新了代码。无论一年如何,这个新代码现在都可以使用。我改变了它,因为很明显,生日不算这一年。如果某人的生日像是&#34; 2015-04-10&#34;这将是有用的。将被计为最接近,因为它只有1天,即使它是2年零1天。

我在代码中写了一条评论。这意味着,如果您想考虑这些年份,请设置$format = "Y-m-d",但如果您不想考虑数年,请设置$format = "m-d",这样就可以减去两者之间的差异几个月和几天。

<?php
$format = "Y-m-d"; // change to "m-d" to ignore years
$today = date($format);

$Bdays = array
(
    array("Lucienne Adkisson", strtotime("2017-10-17")),
    array("Sheryll Nestle", strtotime("2017-02-16")),
    array("Tim Pittman", strtotime("2017-07-29")),
    array("Elmer Letts", strtotime("2017-12-01")),
    array("Gino Massengale", strtotime("2016-04-16")),
    array("Jeremy Wiggs", strtotime("2017-09-17")),
    array("Julian Bulloch", strtotime("2017-06 -21")),
    array("Joella Hinshaw", strtotime("2017-06-25")),
    array("Mamie Burchill", strtotime("2017-11-15")),
    array("Constance Segers", strtotime("2017-06-30")),
    array("Jessy Pinkmann", strtotime("2017-09-11")),
    array("Dudley Currie", strtotime("2017-02-10"))
);


$tmp = 366;
$closest = ["", 0];
for ($i = 0; $i < count($Bdays); $i++)
{
    if (abs($today - date($format, $Bdays[$i][1])) < $tmp)
    {
        $tmp = abs($today - date($format, $Bdays[$i][1]));
        $closest = [$Bdays[$i][0], date("Y-m-d", $Bdays[$i][1])];
    }
}
?>

答案 1 :(得分:1)

试试这个:

DateTime为您提供了一种易于使用的diff方法。如果精确的天数足够,您可以使用该结果的days属性来比较您的日期。然后你必须存储最低增量的索引,最后你可以获取数组中的相应元素

<?php

$today = new DateTime();

$Bdays = array
(
    array("Lucienne Adkisson", date_create("2017-10-17")),
    array("Sheryll Nestle", date_create("2017-02-16")),
    array("Tim Pittman", date_create("2017-07-29")),
    array("Elmer Letts", date_create("2017-12-01")),
    array("Gino Massengale", date_create("2017-04-16")),
    array("Jeremy Wiggs ", date_create("2017-09-17")),
    array("Julian Bulloch ", date_create("2017-06 -21")),
    array("Joella Hinshaw  ", date_create("2017-06-25")),
    array("Mamie Burchill  ", date_create("2017-11-15")),
    array("Constance Segers  ", date_create("2017-06-30")),
    array("Jessy Pinkmann", date_create("2017-09-11")),
    array("Dudley Currie", date_create("2017-02-10"))
);

$len = count($Bdays);
$minDiff = PHP_INT_MAX;
$minIndex = -1;

for ($i = 0; $i < $len; $i++) {
    $diff = $today->diff($Bdays[$i][1]);

    if ($diff->days < $minDiff) {
        $minIndex = $i;
        $minDiff = $diff->days;
    }
}

print_r($Bdays[$minIndex]);

答案 2 :(得分:1)

您可以尝试以下代码:

&#13;
&#13;
<?php
$today=new DateTime();
$count = 0;


$Bdays = array(
    array("Lucienne Adkisson",date_create("2017-10-17")),            
    array("Sheryll Nestle",date_create("2017-02-16")),            
    array("Tim Pittman",date_create("2017-07-29")),           
    array("Elmer Letts",date_create("2017-12-01")),                 
    array("Gino Massengale",date_create("2017-04-16")),              
    array("Jeremy Wiggs ",date_create("2017-09-17")),            
    array("Julian Bulloch ",date_create("2017-06 -21")),             
    array("Joella Hinshaw  ",date_create("2017-06-25")),               
    array("Mamie Burchill  ",date_create("2017-11-15")),                   
    array("Constance Segers  ",date_create("2017-06-30")),                
    array("Jessy Pinkmann",date_create("2017-09-11")),             
    array("Dudley Currie",date_create("2017-02-10"))             
);



for($x = 0, $len = count($Bdays); $x < $len; $x++){

    $diff = date_diff($today, $Bdays[$x][1]);
   
    $difference = $diff->format("  %R%a");
    if($difference > 0){
        if($count == 0){
            $smallest_diff = $difference;
        }
        $count++;
        if($difference < $smallest_diff){
            $smallest_diff = $difference;
            $closest_index = $x;
        }
    }
}

echo "The upcoming birtday person is: <b>" . $Bdays[$closest_index][0] . '</b> and his birthday is on: <b>' . date_format($Bdays[$closest_index][1], "Y/m/d") . '</b>';

?>
&#13;
&#13;
&#13;

它很好。这是输出:

enter image description here

答案 3 :(得分:1)

这是&#34; Arrayy&#34; -class的一个例子。 &#34; $的currentdate&#34;在示例中是固定的,因此结果每天都相同。

单元测试:https://github.com/voku/Arrayy/blob/master/tests/ArrayyTest.php#L2511

安装:composer require voku/arrayy

示例:

$birthDates = array(
    array('Lucienne Adkisson', date_create('2017-10-17')),
    array('Sheryll Nestle', date_create('2017-02-16')),
    array('Tim Pittman', date_create('2017-07-29')),
    array('Elmer Letts', date_create('2017-12-01')),
    array('Gino Massengale', date_create('2017-04-16')),
    array('Jeremy Wiggs', date_create('2017-09-17')),
    array('Julian Bulloch', date_create('2017-06 -21')),
    array('Joella Hinshaw', date_create('2017-06-25')),
    array('Mamie Burchill', date_create('2017-11-15')),
    array('Constance Segers', date_create('2017-06-30')),
    array('Jessy Pinkmann', date_create('2017-09-11')),
    array('Dudley Currie', date_create('2017-02-10')),
);

$birthDatesAraayy = new Arrayy($birthDates);
$currentDate = new \DateTime('2017-09-11');
$format = 'Y-m-d H:i:s';

/**
 * sort by date - helper-function
 *
 * @param array $a
 * @param array $b
 *
 * @return int
 */
$closureSort = function ($a, $b) use ($format) {
  /* @var $aDate \DateTime */
  /* @var $bDate \DateTime */
  $aDate = $a[1];
  $bDate = $b[1];

  if ($aDate->format($format) === $bDate->format($format)) {
    return 0;
  }

  return $aDate->format($format) > $bDate->format($format) ? -1 : 1;
};

/**
 * reduce by date - helper-function
 *
 * @param array $resultArray
 * @param array $value
 *
 * @return array
 */
$closureReduce = function ($resultArray, $value) use ($currentDate) {
  /* @var $valueDate \DateTime */
  $valueDate = $value[1];

  $valueDateInterval = $currentDate->diff($valueDate);

  if ($valueDateInterval->format('%R%a') >= 0) {
    $resultArray['thisYear'][] = $value;
  } else {
    $value[1] = $valueDate->modify('+1 year');

    $resultArray['nextYear'][] = $value;
  }

  return $resultArray;
};

//
// reduce && sort the array
//

/* @var $resultMatch Arrayy|Arrayy[] */
$resultMatch = $birthDatesAraayy->reduce($closureReduce);

$thisYear = $resultMatch['thisYear']->customSortValues($closureSort);
$nextYear = $resultMatch['nextYear']->customSortValues($closureSort);

$resultMatch = $nextYear->reverse()->mergePrependNewIndex($thisYear->reverse()->getArray());

//
// check the result
//

self::assertEquals(
    array(
        array('Jessy Pinkmann', date_create('2017-09-11')),
        array('Jeremy Wiggs', date_create('2017-09-17')),
        array('Lucienne Adkisson', date_create('2017-10-17')),
        array('Mamie Burchill', date_create('2017-11-15')),
        array('Elmer Letts', date_create('2017-12-01')),
        array('Dudley Currie', date_create('2018-02-10')),
        array('Sheryll Nestle', date_create('2018-02-16')),
        array('Gino Massengale', date_create('2018-04-16')),
        array('Julian Bulloch', date_create('2018-06 -21')),
        array('Joella Hinshaw', date_create('2018-06-25')),
        array('Constance Segers', date_create('2018-06-30')),
        array('Tim Pittman', date_create('2018-07-29')),
    ),
    $resultMatch->getArray()
);