【问题标题】:PHP modify array by given date range [closed]PHP按给定日期范围修改数组[关闭]
【发布时间】:2013-03-10 00:10:11
【问题描述】:

我有一个用 php 编写的表单,其中包含以下数组和两个变量: 开始日期和结束日期。

我想做的是只显示用户定义的日期范围内的日期。

$startDate = "2013-03-08";
$endDate = "2013-03-12";

Array
(
    [0] => 2013-03-06|Lorem|Mom|01:45
    [1] => 2013-03-07|ipsum|Dad|01:00
    [2] => 2013-03-08|dolor|Dad|01:45
    [3] => 2013-03-09|sit|Dad|01:00
    [4] => 2013-03-10|amet|Mom|01:45
    [5] => 2013-03-11|Lorem|Mom|01:45
    [6] => 2013-03-12|ipsum|Mom|01:00
    [7] => 2013-03-13|dolor|Dad|01:45
    [8] => 2013-03-14|sit|Mom|01:00
    [9] => 2013-03-15|amet|Mom|01:45
)

提交表单后,数组将如下所示:

Array
(
    [0] => 2013-03-08|dolor|Dad|01:45
    [1] => 2013-03-09|sit|Dad|01:00
    [2] => 2013-03-10|amet|Mom|01:45
    [3] => 2013-03-11|Lorem|Mom|01:45
    [4] => 2013-03-12|ipsum|Mom|01:00
)

实现这一目标的最简单方法是什么?

有什么想法吗?

/珍妮

【问题讨论】:

  • 为什么同一个键有多个值?破坏了数组的全部目的。
  • array_filter() 将是显而易见的函数
  • 您可以使用 foreach 并在 foreach 中执行子字符串,将前 10 个字母的子字符串转换为时间戳,并检查时间戳是否位于用户输入之间,然后取消设置值不或不喜欢 @MarkBaker 你使用数组过滤器

标签: php arrays date filter


【解决方案1】:

我建议使用array_filter() 函数。

$startDate = strtotime('2013-03-08');
$endDate = strtotime('2013-03-12');

$array = array(...); // your input array

$filteredArray = array_filter($array, function($value) use ($startDate, $endDate) {
    $valArray = explode('|', $value);
    $date = strtotime($valArray[0]);
    return ($date >= $startDate && $date <= $endDate);
});

请注意,以上内容适用于 PHP >= 5.3.0 对于旧版本,您必须将匿名函数替换为命名函数并像这样调用它:

$startDate = strtotime('2013-03-08');
$endDate = strtotime('2013-03-12');

$array = array(...); // your input array

$filteredArray = array_filter ($array, 'filterArray');

function filterArray ($value) {
    global $startDate;
    global $endDate;
    $valArray = explode('|', $value);
    $date = strtotime($valArray[0]);
    return ($date >= $startDate && $date <= $endDate);
}

【讨论】:

  • 嗨,迈克,我问了一个类似的问题,发现这段代码有效,但我的数组是一个 json_decoded 数组,它有一个名为 date 的键。它实际上是多个数组,我会将$valArray = explode('|', $value); 更改为什么,以便从密钥date 中获取我的所有日​​期,谢谢。示例代码codepad.org/rSJMyMZl
  • @Anagio 首先,您可能会将$array['results'] 传递给函数,因为这确实是您感兴趣的内容。其次,您不再需要在函数中使用explode(),因为您已经有一个$value 的数组。您只需比较 $value['date'] 的值。请参阅此代码示例codepad.org/fvPOVBkT 请注意,在您的情况下,我从strtotime() 更改为DateTime::createDateFromFormat(),因为您的日期不是strtotime() 可以处理的格式。这实际上在键盘中不起作用,因为它显然不支持 DateTime。
  • 谢谢,我只需要将 php 更新到 5.3,DateTime::createDateFromFormat() 就可以工作了。真的很感激!!!
【解决方案2】:

你可以这样做:

让 $dates 成为你的输入数组

$dates = array(
           '0' => '2013-03-06|Lorem|Mom|01:45',
           '1' => '2013-03-07|ipsum|Dad|01:00',
           '2' => '2013-03-08|dolor|Dad|01:45',
           '3' => '2013-03-09|sit|Dad|01:00',
           '4' => '2013-03-10|amet|Mom|01:45',
           '5' => '2013-03-11|Lorem|Mom|01:45',
           '6' => '2013-03-12|ipsum|Mom|01:00',
           '7' => '2013-03-13|dolor|Dad|01:45',
           '8' => '2013-03-14|sit|Mom|01:00',
           '9' => '2013-03-15|amet|Mom|01:45)'
        );


$startDate = "2013-03-08";
$endDate = "2013-03-12";

$new_startDate = strtotime($startDate);
$new_endDate = strtotime($endDate);

$user_dates = array();

foreach ($dates as $date) {
    $date_values = explode('|', $date);
    $current_date_value = $date_values[0];
    $current_date_value = strtotime($current_date_value);

    if ($current_date_value >= $new_startDate && $current_date_value <= $new_endDate) {
        $user_dates[] = $date;
    }
}

$user_dates 将保存您需要的日期

希望对你有帮助:)

【讨论】:

  • 谢谢您,先生。现在一切都说得通了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 2021-03-05
  • 2021-05-25
  • 1970-01-01
  • 2013-11-04
相关资源
最近更新 更多