Как назначить $ arr_date для цикла while? - PullRequest
0 голосов
/ 12 октября 2011

Это результат $arr_date.

Array
(
    [0] => stdClass Object
        (
            [date] => 2008-08-20
            [page_views] => 2
        )

    [1] => stdClass Object
        (
            [date] => 2011-05-03
            [page_views] => 1
        )

    [2] => stdClass Object
        (
            [date] => 2011-09-05
            [page_views] => 4
        )

    [3] => stdClass Object
        (
            [date] => 2011-10-11
            [page_views] => 2
        )

)

Как поместить мой массив $arr_date в цикл while? Это еще не работает.

while (true) {
        $page_ctr++;
        if (date('Y-m', strtotime($arr_date)) > date('Y-m')) {
            $total_pages = $page_ctr;
            break;
        }

 }

Ответы [ 3 ]

0 голосов
/ 12 октября 2011

При использовании объектов вы должны использовать вызовы объектов.пример

$object -> objectcontent

в вашем случае это будет

$arr_date[0]->date

Посмотрите на это

    //Defining my object to look like yours. I just set the year to 2012 so the while will succeed.
$array = array("date" => "2012-10-20", "page_views" => 2);
    $object = (object) $array;
    $arr_date[] = $object;

//Making an increment variabel
        $i = 0;
        while (true) {

            $page_ctr++;
    //Setting my array $arr_date to iterate through the increment variabel, and output the objects content with the name date
            if (date('Y-m', strtotime($arr_date[$i]->date)) > date('Y-m')) {

                    $total_pages = $page_ctr;

                break;
            }
//Increasing my increment variabel.
            $i++;

     }
     //printing the total pages.
     print $total_pages;

Тем не менее, на вашем месте я бы использовалЦикл foreach, который выполняет итерации по массиву

//Setting increment variable $page_ctr to zero
$page_ctr = 0; 
//Starting foreach array and asking the arrays key value to be set in $key and the value to
//be set in $value. in this case $value will be the object
foreach ($arr_date as $key=>$value) {   
//increasing the increment variable by one
     $page_ctr++;   
//checking your objects date against the current date to see if its bigger.
     if (date('Y-m', strtotime($value->date)) > date('Y-m')) {
       $total_pages = $page_ctr;
//Breaking
       break;
     }

}

Это готовый к копированию код для тестирования и проверки.

<?php
$array = array("date" => "2012-10-20", "page_views" => 2);
$object = (object) $array;
$arr_date[] = $object;

$page_ctr = 0; 
$total_pages = 0;

foreach ($arr_date as $key=>$value) {   

     $page_ctr++;   

     if (date('Y-m', strtotime($value->date)) > date('Y-m')) {
       $total_pages = $page_ctr;

       break;
     }

}

 print $total_pages;


?>
0 голосов
/ 12 октября 2011

Я не совсем уверен, что ваша настоящая общая проблема заключается в том, что вы пытаетесь ее решить, но вы можете инкапсулировать свою проблему выбора даты в фильтр массива, а затем просто выбрать то, что вам нужно. Позаботьтесь, чтобы вы не создали бесконечный цикл, в любом случае:

class ArrayCallbackFilter extends FilterIterator
{
    private $param;
    private $callback;
    public function __construct($param, $callback, Array $array)
    {
        $this->param = $param;
        $this->callback = $callback;
        $iterator = new ArrayIterator($array);
        parent::__construct($iterator);
    }
    public function accept()
    {
        $current = $this->getInnerIterator()->current();
        $func = $this->callback;
        return (bool) $func($this->param, $current);
    }
}

$dateIsLarger = function($date, $object)
{
    return (date('Y-m', strtotime($object->date)) > $date);
};


$date = date('Y-m');
$total_pages = FALSE;
$page_ctr = 0;
while (true) {

        $page_ctr++;

        foreach(new ArrayCallbackFilter($date, $dateIsLarger, $dates) as $object)
        {
            $total_pages = $page_ctr;
            break 2; # <<-- break the right level
        }
        throw new Exception('Endless Loop.');
}

Демо / Песочница чтобы поиграть для себя.

0 голосов
/ 12 октября 2011

Попробуйте цикл foreach вот так

$page_ctr = 1;$total_pages=0;
foreach ($arr_date as $k=>$v)
{
  if (date('Y-m', strtotime($v->date)) > date('Y-m')) {
    $total_pages += $page_ctr;
    break;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...