Путаница в примере цикла foreach в PHP - PullRequest
13 голосов
/ 26 мая 2011

Один из примеров цикла foreach в PHP:

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

У меня проблемы с пониманием того, что делает =>.Может кто-нибудь объяснить мне, как это «видно» или оценивается PHP?Каков порядок работы, какое значение присваивается $key?

Чем оно отличается от:

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

?

Я логически думал, что значение $value будет присвоено $key, тогда оно будетбыть назначенным как строка $row, но это, очевидно, неправильно ...

Ответы [ 6 ]

22 голосов
/ 26 мая 2011

Я понимаю, что это немного сложно, у меня были проблемы с пониманием, когда я впервые начал использовать его. Чем больше вы его используете, тем больше в этом смысла.

Ваш массив будет выглядеть так:

//  "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.

9 голосов
/ 26 мая 2011

Массивы 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"
}

См. ручную запись для foreach.

2 голосов
/ 26 мая 2011

Два примера одинаковы, но первый добавляет определение ключа, на который вы в данный момент смотрите, и называет его $ key.

Сравните с array() определением, например array('key' => 'value')

Если вы используете первый метод, у вас есть $ key, содержащий ключ, а во втором примере - нет.

0 голосов
/ 26 мая 2011

Из документации PHP :

Для массивов, присвоение значения именованный ключ выполняется с помощью "=>" оператор. Приоритет этого Оператор такой же, как и другие операторы присваивания.

Этот вопрос также заинтересовал меня по поводу названия оператора => в PHP.

Как видите, документация явно не дает ему имя. Это привело меня к поиску каналов PHP на IRC. По общему мнению, это называется оператор ракета .

0 голосов
/ 26 мая 2011

коды операций для 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)

Извините за странное представление кода операции.

По сути, версия без ключа назначает на две итерации меньше переменных. Он не назначает ключ и временную переменную, а просто назначает переменную напрямую.

0 голосов
/ 26 мая 2011
foreach ($row as $key => $value) { ..somecode..}

Вышеуказанное используется в ассоциативном массиве, например:

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

В приведенном выше случае переменной $ key присваивается первое значение [a на первой итерации, b на второй, c в последнем цикле] (называемое ключом), а переменной $ value назначается второе значение [1 на первой итерации, 2 на второй, 3 на финальной] (называется значением.)

Если бы их назначение клавиш было пропущено, тогда значению $ все равно будет присвоено второе значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...