PHP。找到数组中随机生成日期中的最低日期

时间:2016-03-09 16:09:47

标签: php arrays date max min

我刚开始学习PHP。我在任务中遇到的最后3天。谷歌拒绝提供帮助。问题出现了。

有一项任务 - 在数组$ date中查找随机生成日期中的最低日期。这就是我所做的:

// Create two variables of type timestamp with the minimum and maximum value dates

    $Min = strtotime('1970-01-01 00:00:00');
    $Max = strtotime('3000-01-01 00:00:00');

// Create an array of 5 random dates, using a random number generator

    for ($i = 0; $i<5; $i++) {$date[$i] = rand($min, $max);}

// Check, like all good

    var_dump($date);

// Now I want to select the day of the accident the smallest output of dates. Or, for example, the largest month. I enter the command

    $Y = min(date('d', $date[$i]));

    var_dump($y);

但是浏览器会发誓,产生错误:

  

(!)注意:未定义的偏移量:

中的5      

(!)警告:min():当只给出一个参数时,它必须是a   

中的数组

//我试图使用标记 - @,但它不能解决问题,只能隐藏错误。

据我所知,错误意味着错误的索引,而且$ Y - 不是数组。尝试用数组表示$ Y,但仍然是5个错误

//我试图用这样的方式写这行:

$Y = min(date('d', $date[0]), date('d', $date[1]), date('d', $date[2]), date('d', $date[3]), date('d', $date[4]));

!!! BINGO !!!一切正常! 但是如果我在数组$ date中有25,000个元素怎么办?我要写这行多长时间?

亲爱的程序员,请帮忙。如何合理,简洁,清晰地写出最后一行,以便在没有错误条件的情况下执行任务?怎么了?谢谢!

5 个答案:

答案 0 :(得分:0)

强大的解决方案是使用for循环来比较每个元素,可能是foreach循环。

$min = date('d', $date[0]);
foreach($date as $d){
    $min = min(date('d', $d), $min);
}

for循环会做同样的技巧,但你必须引用索引号。但除非你还想知道它是什么元素,否则可以省去麻烦。

答案 1 :(得分:0)

我知道这看起来很奇怪,但你实际上可以使用php(7)提供的东西:

// 10 random ints
$randoms = array_map(function(){ 
    return rand(); 
},range(0,10));

// 10 random dates
$dates = array_map(function($rand_int){ 
    // there is probably a easier way to do that
    return (new DateTimeImmutable())->setTimeStamp($rand_int); 
},$randoms);

// apply min and extract Day or whatever you like.
var_dump( min($dates)->format('Y-m-d - l') );

// result:
// string(21) "1974-11-23 - Saturday"

以下小记录很重要:

http://php.net/manual/en/datetime.diff.php

  

从PHP 5.2.2开始,可以使用比较运算符比较DateTime对象。

哪个min应该在幕后做。

答案 2 :(得分:0)

你几乎让它运转起来,只是一些小错误。

  • 未使用的变量($ Min和$ Max)
  • 未定义的变量($ date,$ min和$ max)
  • 未定义的密钥($ date [$ i])
  • 错误使用min()

在php中,通常将变量名称写为小写,对于函数名称也是如此。

// define all variables needed
$dates = array();
$min = strtotime('1970-01-01 00:00:00');
$max = strtotime('3000-01-01 00:00:00');

for ($i = 0; $i<5; $i++) {
    $dates[$i] = rand($min, $max);
}

// lookup the lowest date int and convert it to a date string
$accident = date('d', min($dates));

答案 3 :(得分:0)

您可以使用natsort按照从最低到最高的顺序对时间戳进行排序,然后从已排序的数组中选择第一个元素。

natsort($dates);
$lowest = $dates[0];

这样,您的时间戳应该是第一个可能的最低值。

以下是natsort上的手册页,了解有关该功能的更多信息

答案 4 :(得分:0)

我的朋友。

在使用函数之前,您应该阅读有关它们的文档。

所以你不能像那样使用strtotime:

strtotime('3000-01-01 00:00:00');

它会返回“false”而不是整数。小心这个。 http://php.net/manual/en/function.strtotime.php

还有一个: http://php.net/manual/en/function.min.php

另外你应该知道在php中变量名是区分大小写的。所以在你的例子中

 $Min = strtotime('1970-01-01 00:00:00');
    $Max = strtotime('3000-01-01 00:00:00');

// Create an array of 5 random dates, using a random number generator

    for ($i = 0; $i<5; $i++) {$date[$i] = rand($min, $max);}

变量$ min和$ Min是差异。

所以变量$ min未定义。

现在你可以看看我的简单解决方案:

<?php
// Create two variables of type timestamp with the minimum and maximum value dates

$Min = strtotime('1970-01-01 00:00:00');
var_dump('Min = '. $Min);
$Max = strtotime('2030-01-01 00:00:00');
var_dump('Max = '. $Max);


// Create an array of 5 random dates, using a random number generator

for ($i = 0; $i<5; $i++) {$date[$i] = rand($Min, $Max);}

// Check, like all good

var_dump($date);

// Now I want to select the day of the accident the smallest output of dates. Or, for example, the largest month. I enter the command

$array = [];
foreach($date as $value)
{
    $array[date('Y-m-d', $value)] = date('d', $value);
}
var_dump($array);


$Y = min($array);

var_dump($Y);