PHP foreach, который возвращает только ключи
Теоретический вопрос, который, возможно, не имеет никакого смысла, но все же, может быть, есть умный ответ.
Я хочу перебирать массив и получать его ключи и что-то с ними. Быстрый пример того, что я делаю:
foreach($array as $key => $value) {
$other_array[$key] = 'something';
}
Теперь PHP Mess Detector
кричит, что $value
не используется в этой области. Поэтому я думал, что, возможно, это не лучший способ получить доступ к keys
моего array
.
Любая идея, как это сделать без излишней выгрузки values
из моего array
? Имеет ли он какое-либо значительное влияние на производительность... или, может быть, я просто параноик и должен продолжать, не тратя никого времени на глупые вопросы:).
Ответы
Ответ 1
Вы можете сделать что-то вроде этого
foreach(array_keys($array) as $key) {
// do your stuff
}
Это сделало бы foreach итерацией по массиву, состоящему из ключей из вашего массива вместо фактического массива. Обратите внимание, что это, вероятно, не лучше с точки зрения производительности, но.
Ответ 2
Да, есть более быстрый способ сделать это: http://php.net/manual/en/function.array-keys.php
Ответ 3
Просто проигнорируйте это сообщение.
В 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.
Ответ 4
Если вы хотите установить все ключи на определенное значение, вы можете просто сделать это следующим образом:
$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
)
Ответ 5
чтобы избежать интервала времени.
$a = ['1','A','B','12','ui'];
while(true) { sleep(1);
$b = next($a) ? current($a): reset($a);
echo key($a) , ':' , $b , PHP_EOL;
}