【问题标题】:PHP removing values meeting specific conditon from arrayPHP从数组中删除满足特定条件的值
【发布时间】:2016-03-11 23:25:43
【问题描述】:

所以,长话短说,我有一个日期对象数组($occupied)。

我想将这些日期与 $now=dateTime() 进行比较,以便在 $now 之前发生的任何 $occupied[$i] em> 将被删除。我尝试了一些未设置的解决方案,另一个使用(全新的)array_push()。 它都没有奏效,所以我想我除了明显之外还缺少一些逻辑.. 欢迎任何方法:) 这是代码中有趣的部分:

$occupied=["2016-02-19", "2016-02-20", "2016-02-21", "2016-02-18", "2016-02-19", "2016-02-20", "2016-02-21", "2016-03-30", "2016-03-25", "2016-03-26"].
$now = new DateTime();

我的想法包括:

$now= new dateTime();
for($i=0;$i<count($occupied);$i++){
    $occupied[$i]=new dateTime($occupied[$i]);  
    $diff[$i] = $now->diff($occupied[$i]);
    echo $diff[$i]->format('%r%a');
    if(get_object_vars($diff[$i])["invert"]==1){
       unset($occupied[$i]);
      }
  }

和主题的变化.. 道歉,如果它是微不足道的,我的背景是非常基本的......我试图通过阅读 PHP 手册和这里的一些答案来避免发布,其中包括“从数组中删除值//按键删除元素”,但我无法弄清楚..

提前致谢!

【问题讨论】:

  • 究竟包含什么$occupied?您说它包含 "date objects" 但代码显示字符串并将它们用作字符串。通过“日期对象”,我了解DateTime 类的实例。
  • 是的,我的错... $occupied 原本是字符串,然后通过" new dateTime($objects[$i]);... 转换为对象

标签: php arrays datetime object


【解决方案1】:

使用此代码:

$occupied=["2016-02-19", "2016-02-20", "2016-02-21", "2016-02-18",
        "2016-02-19", "2016-02-20", "2016-02-21",
        "2016-03-30", "2016-03-25", "2016-03-26"];

$now = new DateTime();
$nowStr = $now->format("Y-m-d");

$occupiedFiltered = array_filter($occupied,
    function($item) use($nowStr){
        return $item > $nowStr;
    }
);

$occupiedFiltered 将是

array(3) {
  [7]=>
  string(10) "2016-03-30"
  [8]=>
  string(10) "2016-03-25"
  [9]=>
  string(10) "2016-03-26"
}

【讨论】:

  • $now = new DateTime(); $nowStr = $now-&gt;format("Y-m-d"); 只是写$nowStr = date('Y-m-d');的更长的方式
【解决方案2】:

您可以为此使用array_filter

$now   = new DateTime("2015-12-31"); // Giving $now a fixed value so the output is the same for people who read in 10 months, you can use DateTime().
$dates = [
    "2015-12-29",
    "2015-12-30",
    "2015-12-31",
    "2016-01-01"
];

$newerDates = array_filter($dates, function($dateString) use ($now) {
    $date = new DateTime($dateString);

    return $date > $now;
});

在这种情况下,$newerDates 将包含 "2016-01-01"

【讨论】:

    【解决方案3】:

    您可以使用foreach 循环而不是for 循环。

    <?php
    
    $occupied = [
        "2016-02-19", "2016-02-20", "2016-02-21", 
        "2016-02-18", "2016-02-19", "2016-02-20", 
        "2016-02-21", "2016-03-30", "2016-03-25", 
        "2016-03-26"
    ];
    
    $now = new DateTime();
    $now = $now->format("Y-m-d");
    
    foreach ($occupied as $k => $date) 
        if ($date < $now)
            unset($occupied[$k]);
    
    
    print_r($occupied);
    

    这会返回:

    Array
    (
        [7] => 2016-03-30
        [8] => 2016-03-25
        [9] => 2016-03-26
    )
    

    另外,我个人更喜欢array_filter() 方法,而不是像许多其他人建议的那样手动遍历。

    【讨论】:

    • $now = new DateTime(); $now = $now-&gt;format("Y-m-d"); 只是写$now = date('Y-m-d');的更长的方式
    【解决方案4】:

    这是array_filter() 的经典用法。顺便说一句,您可以使用通常的comparison operators 直接比较两个DateTime 对象。只要他们使用相同的timezone,PHP 就会产生您期望的结果。 (即使他们不使用相同的时区,它也会产生正确的结果,只是当时区不同时,不用笔和纸自己计算它们并不容易。)

    现在,代码:

    $occupied=["2016-02-19", "2016-02-20", "2016-02-21", "2016-02-18", "2016-02-19", "2016-02-20", "2016-02-21", "2016-03-30", "2016-03-25", "2016-03-26"];
    $now = new DateTime();
    
    $filtered = array_filter(
        $occupied,
        function ($date) use ($now) {
            // Keep only the items that are greater (later) than $now
            return $now <= new DateTime($date);
        }
    );
    
    print_r($filtered);
    

    它显示(今天是2016-03-12):

    Array
    (
        [7] => 2016-03-30
        [8] => 2016-03-25
        [9] => 2016-03-26
    )
    

    【讨论】:

    • 我选择了这个,因为它稍微详细一些,它帮助我理解了sintax。无论如何,由于第一个答案几乎相同并且得到了更多的支持,如果社区要求我将改为那个答案..
    • 接受答案是问题作者的特权;你不必接受一个或另一个答案,因为有人告诉你。社区通过投票来表达其偏好。你也可以投票给你喜欢的所有答案。当接受的答案比其他答案的票数少时,这不是不寻常的情况;有时甚至会发生接受的答案有负面评价(社区成员的反对票多于赞成票)。
    【解决方案5】:

    我通常创建一个日期,而不是日期时间。

    $now = date('Y-m-d');
    
    ...
    if($occupied[$i] < $now){
        unset($occupied[$i]);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 2022-11-30
      • 1970-01-01
      相关资源
      最近更新 更多