Foreach改变一把钥匙

时间:2011-08-07 13:18:14

标签: php

我检索一组mysql行作为关联数组的数组(我正在使用pdo fetch all)。我的关联数组包含一个名为“password”的键。如何循环遍历数组以更改所有密码值?如果密码等于0,我需要将它们设置为0。

$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
/* gotta strip all the password, I can't send them! */
foreach($result as $res)   $res['password'] = (!$res['password']) ? 0 : 1; 

2 个答案:

答案 0 :(得分:6)

&中的 foreach 怎么样:

foreach($result as & $res) {
    $res['password'] = (!$res['password']) ? 0 : 1; 
}

并且,作为预防措施,您可能希望此foreach指令遵循unset()循环,以打破数组最后一个元素的引用:

unset($res);


作为参考,引用the manual

  

您可以使用&前面的$ value来轻松修改数组的元素。   
这将分配参考而不是复制值。

稍后在同一个手册页上有关于unset()的说明。

答案 1 :(得分:1)

Foreach允许您引用当前值(&运算符),因此它是您要更改的值的别名。然后你已经“手头”了。

在引用当前元素旁边,您也可以引用密码值:

foreach($result as &$res) {
    $password = &$res['password'];
    $password = (int)(bool) $password;
}    
unset($res, $password);

如果您不想使用引用并希望处理数据副本,则可以使用array_map轻松实现此目的:

$result = array_map(function($res)
{
    $res['password'] = (int)(bool) $res['password'];
    return $res;
}, $result);

或者,如果您想直接使用没有引用的原始数组:

foreach($result as $key => $res)
{
    $result[$key]['password'] = (int)(bool) $result[$key]['password'];
}

你可以在较旧的PHP代码中找到这种变体,因为foreach过去不可能使用这些变体,但是它并不容易阅读。