PHP在数组中爆炸

时间:2016-10-09 21:55:30

标签: php arrays

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

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"
)

没有创建任何循环?

3 个答案:

答案 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
)

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

答案 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," "));

example

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

然而,有了这个,你应该小心nest level errors,你可以过多地调用函数,就像在镜子中查看镜像的反射一样。