我有一段时间遇到麻烦,现在尝试根据数组中的日期过滤我的结果。例如,我想创建一个具有用户指定年数的发票系统来搜索发票。因此,如果我指定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!
答案 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
的所选条目。