您好,我一直在努力采用最有效的方法。我有一个像这样的数组
array(3) {
[0]=>
object(stdClass)#495 (4) {
["year"]=>
string(4) "2015"
["month"]=>
string(1) "1"
["dayofmonth"]=>
string(2) "29"
["posts"]=>
string(1) "3"
}
[1]=>
object(stdClass)#521 (4) {
["year"]=>
string(4) "2015"
["month"]=>
string(1) "1"
["dayofmonth"]=>
string(2) "28"
["posts"]=>
string(1) "2"
}
[2]=>
object(stdClass)#522 (4) {
["year"]=>
string(4) "2015"
["month"]=>
string(1) "1"
["dayofmonth"]=>
string(2) "25"
["posts"]=>
string(1) "1"
}
}
我有以下数值
$d = 29, $m = 1, $y = 2015
我想要做的是找到数组[0,1,2]中的哪个项目是我的$ d,$ m和$ y变量给出的日期之前的下一个日期。
例如,下面的答案是[1]
如果日期是$d=28
,那么它将是[2]
如果那天是$d=25
,那么它将返回false。
问题是阵列可能会覆盖多年,所以它需要完全匹配所有3个键,然后在找到键后返回键号。该数组将始终按降序日期顺序
这可能吗?
编辑:
我正在尝试按日期查询项目列表,以便显示
2015年1月29日
单击“下一步”
它会显示第二天,如果有一个项目只是一天减去1但是如果不是那么它将是减去[x]
的那一天所以列表可能是
29 JAN 2015
{items}
28 JAN 2015
{items}
25 JAN 2015
{items}
10 DEC 2014
{items}
29 JAN 2014
{items}
...
25 JAN 1999
{items}
我希望能够拥有这个,所以它只显示最新的,然后有人可以点击显示下一个日期的一堆项目。
如果有更简单的方法通过动态mySQL执行此操作,那将非常有用
进一步编辑
我也可以只提取日期
array(3) {
[0]=>
object(stdClass)#495 (2) {
["post_date"]=>
string(19) "2015-01-29 14:23:28"
["posts"]=>
string(1) "3"
}
[1]=>
object(stdClass)#521 (2) {
["post_date"]=>
string(19) "2015-01-28 14:24:05"
["posts"]=>
string(1) "2"
}
[2]=>
object(stdClass)#522 (2) {
["post_date"]=>
string(19) "2015-01-25 14:41:43"
["posts"]=>
string(1) "1"
}
}
选择第一个[20]个帖子,然后选择" next"会在接下来的几天加载值得发布的帖子
答案 0 :(得分:1)
似乎无论如何,您将需要匹配数组中的对象属性。我建议采取以下措施:
<?php
$dateList = array(
(object)array("year"=>2015, "month"=>1, "dayofmonth"=>29, "posts" => 2 ),
(object)array("year"=>2015, "month"=>1, "dayofmonth"=>28, "posts" => 2 ),
(object)array("year"=>2015, "month"=>1, "dayofmonth"=>25, "posts" => 1 )
);
//print_r($dateList);
$d = 28;
$m = 1;
$y = 2015;
function findPrevious($y, $m, $d, $dateList){
foreach ($dateList as $key=>$object){
if ($object->year == $y && $object->month == $m && $object->dayofmonth == $d){
$propose = $key + 1;
if ($propose > count($dateList)-1 ){
$propose = NULL;
}
return $propose;
}
}
return NULL;
}
print_r(findPrevious($y, $m, $d, $dateList));
请注意,您还需要处理尝试不存在键的可能性,在这种情况下,我只是返回null。但是,抛出异常或完全做其他事情可能更合适。
答案 1 :(得分:0)
如果您的数组已经排序,那么它实际上非常简单,只需按相反顺序循环,直到您的搜索大于当前值
function s($array, $y,$m,$d) {
$array = array_reverse($array);
$search = new DateTime( "$y-$m-$d" );
foreach($array as $k=>$v) {
$current = new DateTime( "{$v->year}-{$v->month}-{$v->dayofmonth}" );
if ( $current >= $search )
return $k-1;
}
// otherwise return false, you didn't find any correct date
return false;
}
答案 2 :(得分:0)
使用SQL Query的方法:
$currentDate = '2015-01-01';
select *
from items i, (Select created_at from items
where created_at > $currentDate
order by created_at asc limit 1) next_date
where i.created_at >= next_date.created_at
and i.created_at <= (Select created_at from items
where created_at > next_date.created_at limit 1)