PHP foreach循环示例混乱

时间:2011-05-25 20:00:01

标签: php foreach

PHP中foreach循环的一个例子是

foreach ($row as $key => $value) { 
    // somecode
}

我无法理解=>正在做什么。任何人都可以让我了解它是如何被“看到”或由PHP评估的? 什么是操作顺序,为$key分配了什么值?

与以下内容不同的是:

foreach ($row as $value) { 
    // somecode
}

我逻辑上认为$value的值会被分配给$key,然后它会被指定为$row的一行,但这显然是不正确的...... < / p>

6 个答案:

答案 0 :(得分:22)

我知道这有点棘手,我在第一次使用它时遇到了解问题。你使用的越多,它就越有意义。

你的数组看起来像这样:

//  "key"   "value"
//    |        |
//    V        V
$row['1'] = 'item1';
$row['2'] = 'item2';
$row['3'] = 'item3';
$row['4'] = 'item4';

键可以是任何东西,它们不需要是数字。这样你就可以遍历数组中的所有项而无需知道密钥!

所以,你的第一个例子可以解释如下:

//         +--- The ARRAY where all of your data is
//         |
//         |       +----- The KEY to access that element of the array
//         |       |
//         |       |        +----- The VALUE of that element
//         |       |        |
//         V       V        V
foreach ($row as $key => $value){
   if($row[$key] == $value){ // this statement is always true
      echo "true AGAIN!";  // and thus will always print this line
   }
}

据我所知,=>实际上并不是一种操作数,它只是用来完成foreach循环的结构。

答案 1 :(得分:9)

PHP数组存储为键和值对:

$arr = array(
    'key1' => 'value1',
    'key2' => 'value2'
);

标准foreach语法只获取值:

foreach ($arr as $value) {
    // value1, value2
}

替代语法也允许您获取密钥:

foreach ($arr as $key => $value) {
    // $key is "key1", then "key2"
    // $value is "value1" then "value2"
}

请参阅manual entry for foreach

答案 2 :(得分:2)

这两个示例是相同的,但第一个示例添加了您当前正在查看的密钥的定义,并将其命名为$ key。

array()定义比较,例如array('key' => 'value')

如果您使用第一种方法,则您的$ key包含'key',而在第二个示例中则不包含'key'。

答案 3 :(得分:0)

foreach ($row as $key => $value) { ..somecode..}

以上用于关联数组,例如:

array("a" => 1, "b" => 2, "c" => 3);

在上面的例子中,$ key变量被赋予第一个值[第一次迭代时的a,第二次上的b,最后一次循环中的c](称为键),$ value变量被赋予第二个值[1在第一次迭代中,2,在第二次迭代,3在最后一次](称为值。)

如果省略了键分配,那么仍然会为$ value分配第二个值。

答案 4 :(得分:0)

带有键和值的foreach的操作码:

BCDF9C 0005: FE_RESET             (CV 0 ($array), u) -> VAR 2
BCE014 0005: FE_FETCH             (VAR 2, u) -> VAR 3
BCE08C 0005: OP_DATA              (u VAR 0 &(0+2208F38), u VAR 0 &(0+2208F38)) -> TMP_VAR 5 &(C8+2208F39)
BCE104 0005: ASSIGN               (CV 2 ($value), VAR 3) -> VAR 4
BCE17C 0005: ASSIGN               (CV 1 ($key), TMP_VAR 5) -> VAR 6
BCE1F4 0005: JMP                  (u &(BCDFA0+4))
BCE26C 0005: SWITCH_FREE          (VAR 2)

只有foreach的操作码,只有值:

BCE2E4 0007: FE_RESET             (CV 0 ($array), u) -> VAR 7
BCE35C 0007: FE_FETCH             (VAR 7, u) -> VAR 8
BCE3D4 0007: OP_DATA              (u VAR 0 &(0+2208F38), u VAR 0 &(0+2208F38)) -> u VAR 0 &(0+2208F38)
BCE44C 0007: ASSIGN               (CV 2 ($value), VAR 8) -> VAR 9
BCE4C4 0007: JMP                  (u &(BCE2E8+B))
BCE53C 0007: SWITCH_FREE          (VAR 7)

对于奇怪的操作码表示感到抱歉。

基本上,没有键的版本每次迭代分配的变量少两个。它不分配键和临时变量,但它只是直接分配var。

答案 5 :(得分:0)

来自PHP Documentation

  

对于数组,为a赋值   命名密钥使用“=&gt;”执行   运营商。这个的优先顺序   运算符与其他运算符相同   赋值运算符。

这个问题也让我对PHP中=>运算符的名称感到好奇。

正如您所看到的,文档没有明确地为其命名。这导致我在IRC上侦察PHP频道。普遍的共识是它被称为 rocket 运算符。