0

这是一个示例数组。值格式为 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);
}

有什么建议么?

4

6 回答 6

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

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

于 2013-05-26T08:03:11.767 回答
5

您的代码并不太远,只是您以错误的方式将其放入数组中。请看以下不同的示例:

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

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

(匿名)函数基本上包含您的代码,然后它使用该array_map函数将该函数映射到数组。

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

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

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);
}

正如您所看到的,对于所有这些不同的情况,您可以在顶部使用(匿名)函数,因此首先使用它可以避免您更改大多数代码。你这里也有一个常见的映射情况,所以我认为它最适用。但是,这可能会有所不同,因此请保持思想开放并使用您认为最适合您的具体情况的方法。

于 2013-05-26T08:02:50.883 回答
3

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

for ($i = 0; $i < count($array); $i++)
{
    $array[$i] = substr($array[$i], 0, -3);
}
于 2013-05-26T08:02:41.243 回答
3

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

设置$array[$key]你想要的值,它会工作的。

于 2013-05-26T08:04:15.070 回答
1

简单而简短的解决方案:

$array = array_map(function($time) {
    return substr($time, 0, -3);
}, $array);
于 2013-05-26T08:17:02.673 回答
0

这应该工作正常

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

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

foreach($array as $key => $val){
    $array[$key] = substr($val, 0, -3);
}
于 2013-05-26T08:21:27.550 回答