<?php

/*
 * Not an issue.
 */
// No double arrow in assignment.
foreach ($array as $v ) {}
foreach (array( 1 => 'value') as $v ) {}

// Unique variables.
foreach ($array as $k => $v ) {}
foreach ($array as $k => &$v ) {}
foreach ($array as $k['key'] => $k['value'] ) {}
foreach ($array as $k[$name] => $k[$value] ) {}
foreach ($data as $key => [$id, [$name, $address]]) {}
foreach ($data as $key => list("id" => $id, "name" => $name)) {}
foreach ($array as $key => list($a) ) {}

/*
 * The issue.
 */
foreach ($array as $k ) {}
foreach ($array as /*comment*/ $k['key'] ) {}
foreach ($array as /*comment*/ $k[/*comment*/ $name] ) {}
foreach ($array as [$a] ) {}
foreach ($array as list($a, $key, $b) ) {}
foreach ( $data as $this->prop['key'] ) {}
foreach ( $array as list( $a, $key['key'] ) ) {}

// Also detect the same variable being used in combination with a reference assignment.
foreach ($a as &$k) {}

// Ensure non-unique variables used in foreach list assignments are disregarded. Not the concern of this sniff.
foreach ($data as $key => list(, ,)) {} // Invalid, empty list. Bow out.
foreach ($data as [$id => $id]) {}
foreach ($data as $key => list("id" => $id, "id" => $id)) {}
foreach ($data as $key => ["id" => $id, "id" => $id]) {}

/*
 * Parse errors, not our concern.
 */
foreach ($array) {} // Missing "as".
foreach ($array as $k => $k
foreach ($array as $k => ) {}
