PHP foreach, который возвращает только ключи

Теоретический вопрос, который, возможно, не имеет никакого смысла, но все же, может быть, есть умный ответ.

Я хочу, чтобы итерации через массив и получить его ключи и что-то с ними. Быстрый пример того, что я делаю:

foreach($array as $key => $value) { $other_array[$key] = 'something'; } 

Теперь PHP Mess Detector кричит, что $value не используется в этой области. Поэтому я думал, что, возможно, это не лучший способ доступа к keys моего array .

Любая идея, как это сделать без излишнего извлечения values из моего array ? Имеет ли он какое-то значительное влияние на производительность … или, может быть, я просто параноик и должен продолжать, не тратя время никому с глупыми вопросами :).

Вы могли бы сделать что-то вроде этого

 foreach(array_keys($array) as $key) { // do your stuff } 

Это сделало бы foreach итерацией по массиву, состоящему из ключей из вашего массива, а не фактического массива. Обратите внимание, что, вероятно, это не лучше с точки зрения производительности.

Да, есть более быстрый способ сделать это: http://php.net/manual/en/function.array-keys.php

Просто игнорируйте это сообщение.

В PHP способ, которым вы использовали foreach является самым быстрым. Правильно, что вам следует избегать неиспользуемых переменных, но в этом случае вы не можете избежать этого, не теряя при этом некоторой производительности.

Например, foreach(array_keys($arr) as $key) примерно на 50-60% медленнее
чем foreach($arr as $key => $notUsed) .

Эта проблема phpmd уже представлена здесь, и здесь также есть запрос на перенос.

Пока обновляется phpmd, вы также можете использовать этот маленький взлом

В файле /src/main/php/PHPMD/Rule/UnusedLocalVariable.php в методе collectVariables(..) (строка 123 в моем случае) замените

 if ($this->isLocal($variable)) 

от

 if ($this->isLocal($variable) && !($this->isChildOf($variable, 'ForeachStatement') && $variable->getName() === '$notUsed')) 

Это остановит phpmd от сообщения $notUsed любом месте внутри циклов foreach.

Если вы хотите установить все ключи на определенное значение, вы можете просто сделать это следующим образом:

 $array = array( 'foo'=> 'oldval1', 'bar'=> 'oldval2', 'baz'=> 'oldval3' ); $other_array = array_fill_keys(array_keys($array), 'something'); print_r($other_array); 

Это даст:

 Array ( [foo] => something [bar] => something [baz] => something ) 

чтобы избежать предпросмотра.

 $a = ['1','A','B','12','ui']; while(true) { sleep(1); $b = next($a) ? current($a): reset($a); echo key($a) , ':' , $b , PHP_EOL; }