我早些时候问了一个问题,但意识到我在问错事。我有一个采用以下格式的数组
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
之类的随机词语,那么我想从数组中删除整个元素。
这可能吗?我知道有关验证日期的信息,但是它似乎总是针对一种特定格式进行验证,而我不知道格式是什么。
谢谢
答案 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