Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何仅通过php获取2018年的记录_Php_Arrays - Fatal编程技术网

如何仅通过php获取2018年的记录

如何仅通过php获取2018年的记录,php,arrays,Php,Arrays,我想获取列表,他们在2019年没有行动,他们应该在2019年1月之前有唯一的行动。 对于不同的列表,有不同的带有时间戳的数组 下面是列表的一个数组。 它的名字列表1 Array ( [list] => Array ( [0] => Array ( [action] => open [timestamp] => 20

我想获取列表,他们在2019年没有行动,他们应该在2019年1月之前有唯一的行动。 对于不同的列表,有不同的带有时间戳的数组

下面是列表的一个数组。 它的名字列表1

Array
(
    [list] => Array
        (
            [0] => Array
                (
                    [action] => open
                    [timestamp] => 2019-04-18T18:03:24+00:00
                )

            [1] => Array
                (
                    [action] => click
                    [timestamp] => 2018-12-18T18:03:24+00:00
                )

        )
)
因此,在这种情况下,该记录不应打印,因为它在2019年有操作

其他列表有不同的数组

它的名字列表2

 Array
    (
        [list] => Array
            (
                [0] => Array
                    (
                        [action] => open
                        [timestamp] => 2018-04-18T18:03:24+00:00
                    )

                [1] => Array
                    (
                        [action] => open
                        [timestamp] => 2018-03-1T18:03:24+00:00
                    )

            )
    )
在这种情况下,此记录将被打印,因为它在2019年没有任何操作

我正在做什么来实现这一目标:

$date1 = "2018-12-31T024:00:00+00:00"; 
foreach ($list['list'] as $e) {
 if($date1<$e['timestamp'])
   echo $e['action'];
}
但它不会只显示2019年之前的记录。请指导我如何做到这一点。

主要思想是使用DateTime,而不是字符串。最后,希望我做对了:

$latestDate=new\DateTime'2019-01-01'; 记录=$api->getrecord/members?偏移量=0,计数=20; foreach$records['members']作为$member{ $hash=md5$member['email_address']; $lists=$api->getrecord/members/$hash/list; foreach$lists['list']作为$action{ ifnew\DateTime$action['timestamp']>=$latestDate{ 继续2; } } var_dump$lists['list']; }
您也可以使用它,并根据需要替换var_dump。

从API检索数组时,只需使用PHP本机提供的Filtererator类即可。请看下面的示例

namespace App\Filter;

use DateTime;
use FilterIterator;
use Iterator;

class DateFilterIterator extends FilterIterator
{
    protected $filter;

    public function __construct(Iterator $iterator, $filter)
    {
        parent::__construct($iterator);
        $this->filter = $filter;
    }

    public function accept()
    {
        $entry = $this->getInnerIterator()->current();
        return (new DateTime($entry['timestamp']))->format('Y') !== $this->filter;
    }
}
这是我们的过滤器,它将迭代api响应

$object = new ArrayObject($apiResponse);

$iterator = new DateFilterIterator($object->getIterator(), 2018);
foreach ($iterator as $entry) {
    echo "<pre>";
    var_dump($entry);
    echo "</pre>";
}
当我们用2018年初始化过滤器时,我们将检索带有时间戳的数组条目,该时间戳适合2018年。使用FilterInterator类,您可以定义年份,并针对不同的筛选器值反复迭代api响应。过滤本身在一个简单的foreach循环/on迭代中执行


如果要筛选特定日期,则必须根据需要调整筛选器类的accept函数。

我不确定,但您可以尝试我未测试的代码


这是来自数据库吗?为什么不从那里开始呢?因为标题不是来自db,而是来自API。但是API呢?任何一个好的API至少应该给你一些关于获取内容的选项。一次加载所有数据是不切实际的,但是为了过滤数组,是的,它可能是,它的数组_filter:D,或者您可以使用foreach,将两个日期转换为unix时间戳并进行比较,或者使用DateTime类我明白你的意思,但条件应该是什么?谢谢你,但如果数组的日期是2019年,我想跳过它。@Johny在你的问题中发布预期的输出。我已经编辑了这个问题,我想跳过列表1,因为它的日期是2019年。我只想打印列表2数组,因为它在2019年没有日期。如果它的日期是2019年,我想跳过整个数组。请尝试更清楚地表达您的想法。你输入了什么?数组的数组?两个阵列?输出中应该包含什么?2019以下无操作的阵列阵列?你可以在这里举个例子:

function filterDate($date)
{


    $yearDate=date('Y', strtotime ($date['timestamp']));

    if($yearDate==2018)
    {
         return $date;

     }

}



$datesOnly2018=array_filter('filterDate',$list['list']);