在foreach循环中更新数组值

时间:2015-05-12 13:58:41

标签: php foreach

我有这段代码:

$start = ['23','', 'what'];
foreach($start as $i){
  if($i ==''){
    $i = 'satisfaction';
  }
}
print_r($start);

输出结果为:

Array
(
[0] => 23
[1] => 
[2] => what
)

为什么索引[1]没有被'满意'取代。换句话说:我不想创建新数组,而是更改现有数组的索引。实际上,我想要实现的是对那些非空的索引执行intval()(因为空索引上的intval返回0,这不是我想要的)。

3 个答案:

答案 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';
  }
}