PHP匹配数组中的3个键

时间:2015-01-29 17:19:59

标签: php arrays

您好,我一直在努力采用最有效的方法。我有一个像这样的数组

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"会在接下来的几天加载值得发布的帖子

3 个答案:

答案 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)