Обработка массива и изменение формата даты - PullRequest
0 голосов
/ 15 апреля 2019

Я задал вопрос ранее, но понял, что задаю не то.У меня есть массив, который принимает следующий формат

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

Таким образом, он имеет идентификатор, дату и общее количество.Одна проблема заключается в том, что я не знаю, в каком формате может быть столбец «Дата», но в каком бы формате он ни находился, мне нужно преобразовать его в формат dmy.

Так что я зацикливаю свой массив, я знаю, чтоключ всегда будет Дата.

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 Ответ

3 голосов
/ 15 апреля 2019

Ваша проблема лежит в формате дд / мм / гггг.

Из strtotime документации :

Даты в форматах m / d / y или d-m-y неоднозначны, если посмотреть на разделитель между различными компонентами: если разделитель является косая черта (/), тогда предполагается американский м / д / у; тогда как если разделитель - тире (-) или точка (.), затем европейский формат d-m-y предполагается. Однако если год указан в двухзначном формате и разделитель - тире (-), строка даты анализируется как y-m-d.

Чтобы избежать двусмысленности, лучше всего использовать ISO 8601 (ГГГГ-ММ-ДД) даты или 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...