it-swarm.com.ru

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

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

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

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

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

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

26
RandomWhiteTrash

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

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

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

51
inquam

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

В 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.

UPDATE: Приведенная выше рекомендация предполагает PHP 5.6 (соответствующая версия на момент написания этого ответа). Но прошло время, и теперь, используя PHP 7.2, похоже, все наоборот. Как всегда, это зависит от конкретного случая использования, но для ассоциативных массивов с менее чем 100 000 ключей быстрее хранить array_keys($arr) в переменной и использовать это в цикле foreach.

8
AbcAeffchen

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

5
LeJared

Это действительный код PHP, не исправляйте код, но исправьте PHP MD . Конфигурация находится в PHP MD 2.2 И нуждается в этом правило:

<properties>
    <property
        name="allow-unused-foreach-variables"
        description="Allow unused variables in foreach language constructs."
        value="false" />
</properties>
1
botris

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

$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
)
1
core1024

цикл, чтобы избежать foreach через некоторое время.

$a = ['1','A','B','12','ui'];

 while(true) { sleep(1);
    $b = next($a) ? current($a): reset($a);
    echo key($a) , ':' , $b , PHP_EOL;
 }
0
Darksynx