Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 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;
 }