仅返回密钥的 PHP foreach

2022-08-30 10:23:03

理论问题也许没有任何意义,但仍然有一个聪明的答案。

我想迭代数组,获取它的键,并用它们来获取一些东西。我所做的简单示例:

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

现在,在此范围内未使用的尖叫声。因此,我在想,也许这不是访问我的.PHP Mess Detector$valuekeysarray

任何想法如何做到这一点,而不不必要地从我的?它是否对性能有任何重大影响...或者也许我只是偏执,应该继续前进,不要浪费任何人的时间在愚蠢的问题上,:)。valuesarray


答案 1

你可以做这样的事情

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

这将使 foreach 迭代由数组中的键组成的数组,而不是实际的数组。请注意,从性能的角度来看,它可能不会更好。


答案 2

只需忽略此消息。

在PHP中,你使用的方式是最快的。没错,您应该避免未使用的变量,但是在这种情况下,您无法避免它,而不会失去一些性能。foreach

例如:
比 慢约 50% 至 60% 。foreach(array_keys($arr) as $key)foreach($arr as $key => $notUsed)

这里已经报告了phpmd的这个问题,这里也已经有一个拉取请求。

在phpmd更新之前,你也可以使用这个小技巧

在方法中的文件中(在我的情况下为第123行)替换/src/main/php/PHPMD/Rule/UnusedLocalVariable.phpcollectVariables(..)

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

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

这将阻止 phpmd 在 foreach 循环中的任何位置进行报告。$notUsed

更新:上面的建议假设 PHP 5.6(编写此答案时的相关版本)。但是时间流逝,现在使用PHP 7.2似乎恰恰相反。与往常一样,这取决于确切的用例,但对于少于100.000个键的关联数组,存储在变量中并在foreach循环中使用它会更快。array_keys($arr)