如何裁剪PHP数组中的所有值

时间:2013-05-26 08:00:39

标签: php arrays substr

这是一个示例数组。值格式为HH:MM:SS

$array = ['17:31:05', '17:31:06', '17:31:07' ...etc...];

我需要做的是从$ array中的所有值之前删除秒和冒号。我的尝试是做以下事情,但它没有用。

foreach($array as $key => $val){
    $val = substr($val, 0, -3);
}

有什么建议吗?

6 个答案:

答案 0 :(得分:6)

在您的问题示例代码中,您修改了$val而不是$array

而是修改$array

foreach($array as $key => $val){
    $array[$key] = substr($val, 0, -3);
}

foreach($array as &$val){
    $val = substr($val, 0, -3);
}
unset($val); # remove the reference on $val - recommended child protection

我推荐第一个,因为参考变量有些容易出错(更难理解)。

答案 1 :(得分:5)

你的代码并没有太远,你只是把它以错误的方式放到阵列上。请看以下不同的示例:

$removeSeconds = function($val) {
    return substr($val, 0, -3);
}

$arrayWithoutSeconds = array_map($removeSeconds, $array);

(匿名)函数基本上包含您的代码,然后使用array_map函数将 map 函数传递给数组。

如果你更喜欢使用foreach这也是可能的,但是如果你想在你的情况下写入$val,它必须是对数组内部值的引用,这不是总是直截了当。

对于数组(不是引用且不包含任何引用作为“values”),它的工作原理如下:

foreach ($array as &$val) {
               ### ^-- iterate over a reference (PHP variable alias)
    $val = substr($val, 0, -3);
}
unset ($val); ### remove the reference (it does not unset the last array element!)

即使unset之后的foreach操作在技术上不是必需的,也建议您以后不能在代码中设置$val(然后更改最后一个值)数组)。

这就是为什么通常更简单地迭代键和值,然后直接写入特定元素:

foreach ($array as $key => $val) {
    $array[$key] = substr($val, 0, -3);
}

正如您可以看到的所有这些不同的情况,您可以使用(匿名)函数作为顶部,因此首先使用它可以免除您更改大多数代码。你在这里也有一个共同的映射情况,所以我认为它最适用。然而,这可能会有所不同,所以要保持开放的心态,并在具体情况下使用您认为最合适的东西。

答案 2 :(得分:3)

你不能像这样使用foreach循环。请改用循环

for ($i = 0; $i < count($array); $i++)
{
    $array[$i] = substr($array[$i], 0, -3);
}

答案 3 :(得分:3)

那是因为在foreach中,当前元素的值被复制到$val变量。

使用您想要的值设置$array[$key],它会起作用。

答案 4 :(得分:1)

简单明了的解决方案:

$array = array_map(function($time) {
    return substr($time, 0, -3);
}, $array);

答案 5 :(得分:0)

这应该可以正常工作

$result = preg_replace('/(?<=:\d\d):\d+/', '', $array);

或者如果您需要在循环中执行其他操作,请执行

foreach($array as $key => $val){
    $array[$key] = substr($val, 0, -3);
}