Теоретический вопрос, который, возможно, не имеет никакого смысла, но все же, может быть, есть умный ответ.
Я хочу, чтобы итерации через массив и получить его ключи и что-то с ними. Быстрый пример того, что я делаю:
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; }