处理数组和更改日期格式

时间:2019-04-15 15:19:36

标签: php arrays date

我早些时候问了一个问题,但意识到我在问错事。我有一个采用以下格式的数组

Array
(
    [0] => Array
        (
            [ID] => 10000
            [Date] => 21/11/2013
            [Total] => 10
        )
    ...
)

因此它具有ID,日期和总计。一个问题是,我不知道“日期”列的格式是什么,但是我需要将其转换为dmy格式。

所以我正在循环数组,我知道键将始终是Date。

foreach($this->csvData as $item) {
    foreach($item as $key => $value) {
        if($key === 'Date') {
            $item[$key][$value] = date("dmy", strtotime($value));
        }
    }
}

上述情况我遇到了几个问题。首先,在循环之后,如果我输出$this->csvData,则日期值尚未转换为新值。我知道我来对地方了,因为如果我在if内这样做

print_r(date("dmy", strtotime($value));

我可以看到更改的日期。我不认为我会正确分配他们吗?

我试图做的另一件事就是这个。如果日期是完全错误的,请说一些23455之类的随机词语,那么我想从数组中删除整个元素。

这可能吗?我知道有关验证日期的信息,但是它似乎总是针对一种特定格式进行验证,而我不知道格式是什么。

谢谢

1 个答案:

答案 0 :(得分:3)

您的问题出在dd / mm / yyyy格式。

来自strtotime documentation

  

m / d / y或d-m-y格式的日期通过查看来消除歧义   各个组件之间的分隔符:如果分隔符是   斜线(/),则假定为美国m / d / y;而如果   分隔符是破折号(-)或点(。),然后是欧洲d-m-y格式   假设。但是,如果年份以两位数格式给出,并且   分隔符是破折号(-),日期字符串被解析为y-m-d。

     

为避免潜在的歧义,最好使用ISO 8601(YYYY-MM-DD)   日期或DateTime :: createFromFormat()(如果可能)。

所以"21/11/2013"失败了,因为没有21个月...

-用作"21-11-2013"

如果您不知道格式,则可以在之前检查strtotime的返回值:

$arr = [["id" => 100, "data" => "21-11-2013"]];

foreach($arr as $k => &$e) {
    $val = strtotime($e["data"]) ? strtotime($e["data"]) : strtotime(str_replace("/", "-", $e["data"]));
    $e["data"] = date("m/d/y", $val);
    if (!$val) unset($arr[$k]); // if non valid date remove from array
}

实时示例:3v4l