这是一个示例数组。值格式为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);
}
有什么建议吗?
答案 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);
}