这是一个示例数组.值格式为HH:MM:SS
$array = ['17:31:05', '17:31:06', '17:31:07' ...etc...];
Run Code Online (Sandbox Code Playgroud)
我需要做的是从$ array中的所有值之前删除秒和冒号.我的尝试是做以下事情,但它没有奏效.
foreach($array as $key => $val){
$val = substr($val, 0, -3);
}
Run Code Online (Sandbox Code Playgroud)
有什么建议?
在您的问题示例代码中您修改$val而不是$array.
而是修改$array:
foreach($array as $key => $val){
$array[$key] = substr($val, 0, -3);
}
Run Code Online (Sandbox Code Playgroud)
要么
foreach($array as &$val){
$val = substr($val, 0, -3);
}
unset($val); # remove the reference on $val - recommended child protection
Run Code Online (Sandbox Code Playgroud)
我推荐第一个,因为参考变量有些容易出错(更难理解).
您的代码并不太远,您只需将它以错误的方式放在阵列上.请看以下不同的示例:
$removeSeconds = function($val) {
return substr($val, 0, -3);
}
$arrayWithoutSeconds = array_map($removeSeconds, $array);
Run Code Online (Sandbox Code Playgroud)
(匿名)函数基本上包含您的代码,然后使用该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!)
Run Code Online (Sandbox Code Playgroud)
即使是unset在foreach技术上没有必要之后的操作,也建议您$val以后不能在代码中设置(然后更改数组的最后一个值).
这就是为什么通常更简单地迭代键和值,然后直接写入特定元素:
foreach ($array as $key => $val) {
$array[$key] = substr($val, 0, -3);
}
Run Code Online (Sandbox Code Playgroud)
正如您可以看到的所有这些不同情况一样,您可以使用(匿名)函数作为顶部,因此首先使用它可以避免更改大多数代码.你在这里也有一个共同的映射情况,所以我认为它最适用.然而,这可能会有所不同,因此请保持开放的态度,并在具体情况下使用您认为最合适的内容.