PHP - 过滤数组

时间:2015-08-18 10:04:00

标签: php arrays

我有一段时间遇到麻烦,现在尝试根据数组中的日期过滤我的结果。例如,我想创建一个具有用户指定年数的发票系统来搜索发票。因此,如果我指定3年,它只会带回3年的发票。

我的发票数组看起来像这样:

Array
(
    [Invoice_Array] => Array
        (
            [0] => Array
                (
                    [0] => 2884
                    [1] => 15/08/2013
                    [2] => C
                    [3] => -61.54
                    [4] => 0.00
                )

            [1] => Array
                (
                    [0] => 2719
                    [1] => 13/06/2012
                    [2] => C
                    [3] => -200.00
                    [4] => 0.00
                )

            [2] => Array
                (
                    [0] => 99900
                    [1] => 02/03/2011
                    [2] => I
                    [3] => 50.00
                    [4] => 0.00
                )

            [3] => Array
                (
                    [0] => 5685
                    [1] => 02/03/2011
                    [2] => C
                    [3] => -50.00
                    [4] => 0.00
                )

        )

    [Invoice_Count] => 4
)

我尝试过使用另一个问题答案:

foreach ($myarray as $item)
    if ($item->dateitem >= $startDate  &&  
        $item->dateitem <= $endDate)
            $newarray[] = $item;

但是我在上面的数组中实现它时遇到了麻烦。什么是一个很好的方式进入&#39;日期中的数组,然后过滤结果,以便所有其他数据仍然存在,除了日期范围之外的键? (所以如果我从现在开始只想要3年的数据,那么只有密钥[0]。)

我认为首先要解决的问题是如何根据指定的日期范围检查每个密钥/发票中的日期。也许是一个遍历发票的foreach,以及一个判断当前指针位置是否在某个日期范围内的if语句?

表面处理:

$years = 3;
$myarray = array(
    'Invoice_Count' => 6,
    'Invoice_List' => array(
        array('31515', 'I', '255.60', '255.60', '15/06/2015'),
        array('31664', 'I', '330.00', '330.00', '22/07/2015'),
        array('31675', 'I', '4088.40', '4088.40', '27/07/2015'),
        array('31650', 'I', '245.70', '245.70', '29/07/2010')
        ),
    );

$newarray = array();
$boundary = strtotime('today -'.$years.' year');
foreach ($myarray['Invoice_List'] as $item) {
    $parts = explode('/', $item[4]);
    $date = sprintf('%04d-%02d-%0d', $parts[2], $parts[1], $parts[0]);
    if (strtotime($date)>$boundary)
            $newarray[] = $item;
}
print_r(strtotime($date)); echo " - "; print_r($boundary);
echo "<pre>"; print_r($newarray); echo "</pre>";

非常感谢syck!

1 个答案:

答案 0 :(得分:2)

首先,您的日期由dd/mm/YYYY表示,因此不是由strtotime()识别的格式。所以你应该做类似

的事情
$parts = explode('/', $date);
$date = sprintf('%04d-%02d-%0d', $parts[2], $parts[1], $parts[0]);

密切关注“三年前”(回到2012年8月18日)和“过去三年”(2012-2014)之间的差异。

作为一个例子,如果你想回到几年前:

$newarray = array();
$boundary = strotime('today minus '.$years.' year');
foreach ($myarray as $item) {
    $parts = explode('/', $item[1]);
    $date = sprintf('%04d-%02d-%0d', $parts[2], $parts[1], $parts[0]);
    if ($strtotime($date)>$boundary)
            $newarray[] = $item;
}

收集新数组$myarray$newarray的所选条目。