在PHP中有效地使用foreach

时间:2012-02-01 06:17:42

标签: php loops foreach

所以我认为我没有充分利用foreach循环。以下是我对foreach的理解。

  • 它就像foreach(arrayyouwanttoloopthrough as onevalueofthatarray)

  • 不需要计数器或递增,它会自动拉取一个数组,每个循环的值为值,对于该循环,它会调用“as”之后的值。

  • 一旦完成阵列就停止。

  • 基本上应该替换“for”,只要处理数组。

所以我尝试用foreach做很多事情就是修改循环数组中的数组值。但最后我一直发现我必须为这种类型的东西使用for循环。

所以我说我有一个数组(thing1,thing2,thing3,thing4),我想改变它....让我们对所有“BLAH”说,最后有一个数字,我会做< / p>

$counter = 0;
foreach($array as $changeval){
$counter++;
$changeval = "BLAH".$counter;
}

我认为这会改变它,因为$ changeval应该是数组的任何值,对吧?但事实并非如此。我在foreach中找到的唯一方法是设置一个计数器(如上所述),并使用带有counter的索引的数组。但要做到这一点,我必须将计数器设置在循环外,并且它甚至不总是可靠的。为此,我认为使用for循环代替foreach会更好。

那你为什么要使用foreach呢?我想我在这里遗漏了一些东西,因为foreach让GOT能够改变价值......

由于

OH HEY还有一件事。循环中是否可以在循环外设置变量(如i或key)?如果我有2个foreach循环,如

foreach(作为价值的东西)

我必须制作第二个

foreach(thing2 as value2)]

否则会有一些问题?

5 个答案:

答案 0 :(得分:6)

您可以改为使用引用变量:

foreach ($array as &$value)
{
    $value = "foo";
}

现在数组已满foo(请注意&之前的$value)。

通常,循环变量只包含相应数组元素的副本,但&(&符号)告诉PHP使其成为对实际数组元素的引用,而不仅仅是副本;因此你可以修改它。

但是,正如@Tadeck在下面所说,在这种情况下你应该小心在循环结束后销毁引用,因为$value仍将指向数组中的最后一个元素(因此可能会意外修改它)。使用unset执行此操作:

unset($value);

另一种选择是使用$key => $value语法:

foreach ($array as $key => $value)
{
    $array[$key] = "foo";
}

回答你的第二个问题:是的,它们随后可以在循环之外访问,这就是为什么在我的第一个例子中使用引用循环变量时使用unset的好习惯。但是,没有必要在后续循环中使用新的变量名,因为旧的变量名只会被覆盖(没有不必要的后果)。

答案 1 :(得分:2)

您希望通过引用传递:

$arr = array(1, 2, 3, 4);

foreach ($arr as &$value)
{
    $value = $value * 2;
}

// $arr is now array(2, 4, 6, 8)

答案 2 :(得分:0)

扩展的foreach语法如下:

foreach ($array as $key => $value) {
}

使用$key,您可以索引原始数组:

foreach ($array as $key => $value) {
    $array[$key] = "BLAH";
}

答案 3 :(得分:0)

从0增加到......

foreach($array as $changeval){
  if (!isset($counter)) { $counter = 0; }
  $counter++;
  $changeval = "BLAH".$counter;
}

使用ARRAY的索引/键

foreach($array as $key => $changeval){
  $changeval = "BLAH".$key;
}

答案 4 :(得分:0)

您可以在使用foreach循环时使用该键:

foreach ($array as $key => $value)
{
    $array[$key] = "foo";
}

但请注意,对于这种情况,使用像Will suggested这样的引用会更快 - 但无论如何,$key => $value - 语法有时非常有用。