我想知道是否可以转换以下数组:
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"
)
没有创建任何循环?
答案 0 :(得分: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
)
答案 1 :(得分:2)
是的,请使用map:
function first10($s) {
return substr($s, 0, 10);
}
$result = array_map("first10", $yourArray);
警告:只有在您确定日期格式不会改变时,这是一个很好的解决方案,换句话说,前10个字符必须包含日期。
答案 2 :(得分:1)
Praveen Kumar's answer可能是更好的解决方案,但有一种方法可以解决那些不被视为循环的问题。而是使用recursion
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。如果它存在,那么我们再次使用具有相同数组和分隔符的新索引调用该函数。然后我们将这个结果与我们的返回者数组合并,然后返回。
然而,有了这个,你应该小心nest level errors,你可以过多地调用函数,就像在镜子中查看镜像的反射一样。