这是一个示例数组。值格式为 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);
}
有什么建议么?
在您修改的问题示例代码中,$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
我推荐第一个,因为参考变量有点容易出错(更难理解)。
您的代码并不太远,只是您以错误的方式将其放入数组中。请看以下不同的示例:
$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);
}
正如您所看到的,对于所有这些不同的情况,您可以在顶部使用(匿名)函数,因此首先使用它可以避免您更改大多数代码。你这里也有一个常见的映射情况,所以我认为它最适用。但是,这可能会有所不同,因此请保持思想开放并使用您认为最适合您的具体情况的方法。
你不能像这样使用 foreach 循环。改用 for 循环
for ($i = 0; $i < count($array); $i++)
{
$array[$i] = substr($array[$i], 0, -3);
}
这是因为在 foreach 中,当前元素的值被复制到$val
变量中。
设置$array[$key]
你想要的值,它会工作的。
简单而简短的解决方案:
$array = array_map(function($time) {
return substr($time, 0, -3);
}, $array);
这应该工作正常
$result = preg_replace('/(?<=:\d\d):\d+/', '', $array);
或者如果您需要在循环中执行其他操作,请执行
foreach($array as $key => $val){
$array[$key] = substr($val, 0, -3);
}