我有这段代码:
$start = ['23','', 'what'];
foreach($start as $i){
if($i ==''){
$i = 'satisfaction';
}
}
print_r($start);
输出结果为:
Array
(
[0] => 23
[1] =>
[2] => what
)
为什么索引[1]没有被'满意'取代。换句话说:我不想创建新数组,而是更改现有数组的索引。实际上,我想要实现的是对那些非空的索引执行intval()
(因为空索引上的intval返回0,这不是我想要的)。
答案 0 :(得分:3)
根据manual:
为了能够使用
$value
在&
之前的循环中直接修改数组元素。在这种情况下,该值将通过引用分配。
因此,在您的情况下,您应该添加&
:
$start = ['23','', 'what'];
foreach($start as &$i){
// ^ reference
if($i === ''){
$i = 'satisfaction';
}
}
旁注:如果您打算将这些数值更改为数据类型整数,则可以使用(如您所述)intval
或简单类型转换。
$start = ['23','', 'what'];
foreach($start as &$i){
if(is_numeric($i)){
$i = (int) $i;
}
}
var_dump($start);
答案 1 :(得分:2)
因为foreach(...)行为"有点"作为只读迭代器。如果您想修改元素,则必须通过引用访问。
示例:
foreach ($start as &$i) {
}
有关详细信息,请参阅doc:http://php.net/manual/fr/control-structures.foreach.php
答案 2 :(得分:1)
在您的示例中,您只是设置变量$i
,它只是循环的临时变量。相反,将数组键保留在循环中并使用它来设置数组中的值:
$start = ['23','', 'what'];
foreach($start as $k=>$i){
if($i ==''){
$start[$k] = 'satisfaction';
}
}