从日期时间字符串的平面数组中删除时间表达式

问题描述 投票:0回答:3

我想知道是否可以转换以下数组:

Array (
    "2016-03-03 19:17:59",
    "2016-03-03 19:20:54",
    "2016-05-03 19:12:37"
)

进入此:

Array (
    "2016-03-03",
    "2016-03-03",
    "2016-05-03"
)

不创建任何循环?

php arrays datetime sanitization truncation
3个回答
9
投票

如果您可以使用

array_map
,则没有显式循环,尽管它在内部循环:

function format_date($val) {
  $v = explode(" ", $val);
  return $v[0];
}
$arr = array_map("format_date", $arr);

来自 PHP 手册:

对每个元素应用

array_map()

 函数后,
array1
返回一个包含
callback
的所有元素的数组。
callback
函数接受的参数数量应与传递给
array_map()
的数组数量相匹配。

另外,在处理日期时,正确的做法如下:

return date("Y-m-d", strtotime($val));

使用循环的简单方法是使用

foreach()
:

foreach($arr as $key => $date)
  $arr[$key] = date("Y-m-d", strtotime($date));

这是我能想到的最简单的循环方式,将

index
视为任何东西。


输入:

<?php
$arr = array(
    "2016-03-03 19:17:59",
    "2016-03-03 19:20:54",
    "2016-05-03 19:12:37"
);
function format_date($val) {
  $v = explode(" ", $val);
  return $v[0];
}
$arr = array_map("format_date", $arr);

print_r($arr);

输出

Array
(
    [0] => 2016-03-03
    [1] => 2016-03-03
    [2] => 2016-05-03
)

演示:http://ideone.com/r9AyYV


2
投票

是的,使用地图:

function first10($s) {
    return substr($s, 0, 10);
}

$result = array_map("first10", $yourArray);

警告:仅当您确定日期格式不会更改时,这才是一个好的解决方案,换句话说,前 10 个字符必须包含日期。


1
投票

Praveen Kumar 的答案 可能是更好的解决方案,但有一种方法可以处理不会真正被视为循环的问题。相反,你使用递归

function explodeNoLoop($array,$delim,$index=0)
{
    $returnArr = array();
    if(isset($array[$index]))
    {
        $expldoed = explode($delim,$array[$index]);
        array_push($returnArr,$expldoed[0]);
    }
    if(isset($array[$index+1]))
    {
        $returnArr = array_merge($returnArr,explodeNoLoop($array,$delim,$index+1));
    }
    return $returnArr;
}

$myArr = array (
    "2016-03-03 19:17:59",
    "2016-03-03 19:20:54",
    "2016-05-03 19:12:37"
);

var_dump(explodeNoLoop($myArr," "));

示例

这段代码的工作原理是,使用该函数,我们在函数参数提供的索引处分解数组,并将其添加到返回的数组中。然后我们检查下一个索引是否设置了一个值,该值是我们传递给函数的索引的+1。如果存在,那么我们使用具有相同数组和分隔符的新索引再次调用该函数。然后我们将其结果与返回器数组合并,然后返回。

但是,使用这个应该小心嵌套级别错误,即你多次调用一个函数,就像在镜子中观察镜子的反射一样。

© www.soinside.com 2019 - 2024. All rights reserved.