我想知道是否可以转换以下数组:
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"
)
不创建任何循环?
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
)
是的,使用地图:
function first10($s) {
return substr($s, 0, 10);
}
$result = array_map("first10", $yourArray);
警告:仅当您确定日期格式不会更改时,这才是一个好的解决方案,换句话说,前 10 个字符必须包含日期。
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。如果存在,那么我们使用具有相同数组和分隔符的新索引再次调用该函数。然后我们将其结果与返回器数组合并,然后返回。
但是,使用这个应该小心嵌套级别错误,即你多次调用一个函数,就像在镜子中观察镜子的反射一样。