【问题标题】:PHP explode in arrayPHP在数组中爆炸
【发布时间】:2017-02-18 07:47:33
【问题描述】:

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

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

不创建任何循环?

【问题讨论】:

  • 要问一个显而易见的问题。循环有什么问题......?
  • “不创建任何循环?” 否。 最后,您需要更改每个数组元素,因此您必须循环遍历数组。只需搜索如何将一种日期格式转换为另一种格式以及如何将函数应用于每个数组元素。
  • 奇数个问题问:如何在没有 X 的情况下做(在此处插入基本 php\programming term\function)
  • @nogad 有一个简单的解释:他们在某处读到“php 中的循环很慢”。
  • 还有一个更简单的解释(奥卡姆剃刀有人吗?)...作业说“不要使用循环”:D

标签: php arrays


【解决方案1】:

是的,使用地图:

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

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

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

【讨论】:

  • @PraveenKumar 验证不是问题的主题
  • @PraveenKumar 谢谢,我添加了一个警告,以便他知道这个解决方案的限制在哪里。
【解决方案2】:

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。如果它存在,那么我们使用具有相同数组和分隔符的新索引再次调用该函数。然后我们将 this 的结果与我们的返回器数组合并,然后返回它。

但是,使用这个应该小心nest level errors,您会在其中过度调用一个函数太多次,就像在镜子中观察镜子的反射一样。

【讨论】:

  • 呜呜呜!!!哇!但是对于当前情况,递归似乎是一种矫枉过正。哈哈。我们正在创造性地思考。
【解决方案3】:

没有显式循环,如果你可以使用array_map,虽然它在内部循环:

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

来自 PHP 手册:

array_map() 在对每个元素应用callback 函数后返回一个包含array1 的所有元素的数组。 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

【讨论】:

  • 嗯,只用一个参数调用explode()
  • 虽然这仍然是我期望的内部循环,但我想只要 OP 看不到它们他们就不会介意:P
  • 有人将其与 foreach 循环进行对比并展开
  • 非常感谢!这比遍历整个数组更好更快的解决方案。
  • @PraveenKumar 我没有投反对票,但您的第一个答案修订版非常糟糕。我认为你可以改进的是:1)解释array_map()也循环遍历数组2)也许还展示了如何正确地将一种日期格式转换为另一种格式,而不是这种特定格式的“hack”。 3)解释array_map()到底是​​什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多