仅返回键的PHP foreach
理论上的问题,也许没有任何意义,但仍然,也许有一个聪明的答案 我想遍历数组,得到它的键,并用它们做一些事情。我所做的一个简单示例:仅返回键的PHP foreach,php,arrays,foreach,Php,Arrays,Foreach,理论上的问题,也许没有任何意义,但仍然,也许有一个聪明的答案 我想遍历数组,得到它的键,并用它们做一些事情。我所做的一个简单示例: foreach($array as $key => $value) { $other_array[$key] = 'something'; } 现在,PHP-Mess-Detector尖叫说,$value在此范围内未使用。因此,我想这可能不是访问我的数组的键的最佳方式 您知道如何在不从我的数组中不必要地取出值的情况下执行此操作吗?它是否对性能有重大影
foreach($array as $key => $value) {
$other_array[$key] = 'something';
}
现在,PHP-Mess-Detector
尖叫说,$value
在此范围内未使用。因此,我想这可能不是访问我的数组的键的最佳方式
您知道如何在不从我的数组中不必要地取出值的情况下执行此操作吗?它是否对性能有重大影响。。。或者我只是有点偏执,应该继续下去,不要浪费任何人的时间问愚蠢的问题:)。你可以这样做
foreach(array_keys($array) as $key) {
// do your stuff
}
这将使foreach迭代一个由数组中的键组成的数组,而不是实际数组。请注意,从性能的角度来看,这可能并不更好。如果要将所有键设置为某个值,您可以这样做:
$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
)
忽略这个信息
在PHP中,使用foreach
的方式是最快的。您应该避免使用未使用的变量,这是正确的,但在这种情况下,您无法避免它,而不会损失一些性能
例如,foreach(数组_键($arr)作为$key)
大约慢50%到60%
而不是foreach($arr as$key=>$notUsed)
已报告此phpmd问题,并且已存在拉取请求
在更新phpmd之前,您还可以使用
在文件/src/main/php/PHPMD/Rule/UnusedLocalVariable.php中,方法collectVariables(…)
(在我的例子中是第123行)中,替换
借
这将阻止phpmd在foreach循环中的任何位置报告$notUsed
更新:
上面的建议假设为PHP5.6(撰写此答案时的相关版本)。但随着时间的推移,现在使用PHP7.2似乎正好相反。它通常取决于具体的用例,但对于少于100.000个键的关联数组,在变量中存储array\u键($arr)
并在foreach循环中使用它会更快。循环可在一段时间内避免foreach
$a = ['1','A','B','12','ui'];
while(true) { sleep(1);
$b = next($a) ? current($a): reset($a);
echo key($a) , ':' , $b , PHP_EOL;
}
这是有效的PHP代码,不修复代码,但修复PHP MD。
中有一个配置文件
并且需要这个规则:
<properties>
<property
name="allow-unused-foreach-variables"
description="Allow unused variables in foreach language constructs."
value="false" />
</properties>
被18C攻击:-)
在constructionas$key=>$value
中,在分配$key之前,首先在PHP中分配$value
$array=[1,3,6,10];
foreach($array as $k => $k)
print($k.'<br/>');
顺便说一句,不要使用:foreach($k=>数组和$k)
。它会破坏您的阵列 如果您使用的是XML规则集:
这很正常。但是你可以使用:$keys=array\U key($array);foreach($keys as$key){$other_array[$key]='something';}对于这样的实例,您可以抑制mess detector的警告:我相信这里每次迭代都会调用array_keys(),所以这可能不是最明智的做法?根据我记忆,如果对foreach进行一次计算,则进入foreach的数组不会。正如使用foreach(数组(“a”、“b”、“c”)作为$letters)不会在每次迭代中创建新数组一样。如果这是不正确的,那么请确定,在foreach之前创建$keys变量。。。您是否有任何引用指向foreach在每次迭代时对数组求值的事实?从我所看到的,foreach()是使用迭代器实现的,因此只调用返回数组一次的函数。然后,它使用指向现有结果集的迭代器继续处理每个项。因此,使用foreach(array_keys()…@inquam)非常安全,感谢您的见解!这来自我的JavaScript经验,在那里为(var i=0;i)
会在每次迭代中调用indexOf。我想我的想法是所有语言都会以同样的方式进行操作-我很高兴他们没有这样做!我做了一些测试,并且foreach(array\u keys($arr)as$key)
比foreach($arr as$key=>$val)大约慢50%到60%
。但这是正确的,在放置数组_键($arr)
(使用255个元素的数组进行测试,使用php 5.6.0进行100000次循环)+1的位置没有区别,尽管这不是我的想法-示例过于简化:)。无论如何,谢谢你-学习一些新东西:),而(3)
比较短。:-)此外,您应该避免潜在的无限循环。您依赖于内部行为。“这可能会有不好的结局。”finder2我同意。他们可以在将来的版本中改变这种行为,而bug将很难跟踪。我会考虑<代码>前缀($数组为$key=$$)< /> > uh,在哪里使用这些行??@ OLLH?RSSTEDT,在您正在使用的配置文件中,如RuleSET.xml,然后是“代码> PHPMD代码库/ SuthOutOuttoPultRealSeSt. XML<代码>下面有一个提供上下文的答案。如果有人想知道的话。
<properties>
<property
name="allow-unused-foreach-variables"
description="Allow unused variables in foreach language constructs."
value="false" />
</properties>
$array=[1,3,6,10];
foreach($array as $k => $k)
print($k.'<br/>');
foreach($array as $key => $key)
{
$other_array[$key] = 'something';
}