49

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

我想遍历数组并获取它的键并使用它们。我所做的一个简单的例子:

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

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

知道如何在不不必要地取出values我的情况下做到这一点array吗?它是否对性能有任何重大影响......或者我只是偏执并且应该继续而不用愚蠢的问题浪费任何人的时间:)。

4

7 回答 7

80

你可以做这样的事情

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

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

于 2012-09-10T07:17:26.217 回答
17

只需忽略此消息。

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

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

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

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

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

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 个键的关联数组,将其存储array_keys($arr)在变量中并在 foreach 循环中使用它会更快。

于 2014-10-09T15:39:11.250 回答
4

它是有效的 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>
于 2018-09-12T08:03:08.413 回答
2

被 18C 破解 :-)

在构造as $key=>$value中,$value 在分配 $key 之前首先在 PHP 中分配。

$array=[1,3,6,10];

foreach($array as $k => $k) 
   print($k.'<br/>');

对于您的代码:

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

顺便提一句。不要使用:foreach($array as $k => &$k)。它可能会破坏您的阵列。

于 2019-11-21T21:31:15.017 回答
1

如果您想将所有键设置为某个值,您可以这样做:

$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
)
于 2012-09-10T07:26:18.033 回答
1

如果您使用的是 XML 规则集:

    <rule ref="rulesets/unusedcode.xml/UnusedLocalVariable">
        <properties>
            <property name="allow-unused-foreach-variables" value="true" />
        </properties>
    </rule>
于 2020-07-30T05:56:54.773 回答
0

循环以避免在一段时间内进行 foreach。

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

 while(true) { sleep(1);
    $b = next($a) ? current($a): reset($a);
    echo key($a) , ':' , $b , PHP_EOL;
 }
于 2017-10-13T22:58:29.723 回答