PHP соответствует 3 ключам из массива

0

Привет, я боролся с самым эффективным способом сделать это. У меня есть такой массив

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 ключа, а затем вернуть номер ключа после найденного ключа. Массив всегда будет в порядке убывания даты

Это возможно?

РЕДАКТИРОВАТЬ:

Я пытаюсь запросить список элементов на основе даты, чтобы он показывал

29 января 2015 г.

Нажмите "Далее

Он покажет следующий день, который, если есть элемент, будет просто днем минус 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] числа сообщений, а затем "следующий" будет загружаться в следующие дни стоит сообщений

  • 0
    Ваш массив всегда сортируется?
  • 0
    Извините ... но я не понимаю ваших примеров. Пожалуйста, будьте более ясны в отношении next date before the date given
Показать ещё 5 комментариев
Теги:
arrays

3 ответа

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. Однако может быть более целесообразным бросить исключение или сделать что-то еще полностью.

0

Способ использования SQL-запроса:

$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)
  • 0
    Спасибо за предложение. Он должен быть меньше указанной даты, но только элементы на следующую дату, а не все элементы, поэтому он находит следующую дату в строке и запрашивает только те элементы на эту дату (не элементы на эту дату и любую дату ранее, как твой код делает)
  • 0
    данная дата является текущей датой, если вы хотите, чтобы все элементы на следующую дату, вы должны изменить desc на asc и < на >
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;
}
  • 0
    не нужно конвертировать Datetime .. создать 2 int с ггггммдд .. и сравнить его
  • 0
    Это верно, но как быть, если $ m всегда двузначный? Это входной параметр
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню