理论上的问题可能没有任何意义但仍然存在,也许有一个聪明的答案。
我想迭代数组并获取它的键和它们的东西。我做的一个简单示例:
foreach($array as $key => $value) {
$other_array[$key] = 'something';
}
现在,PHP Mess Detector
尖叫,$value
在此范围内未使用。因此,我认为这可能不是访问keys
的{{1}}的最佳方式。
知道如何在不必要地从array
中取出values
的情况下如何做到这一点?它是否会产生任何重大的性能影响...或者我可能只是偏执狂而且应该继续下去而不会浪费任何人的时间来处理愚蠢的问题:)。
答案 0 :(得分:55)
你可以做这样的事情
foreach(array_keys($array) as $key) {
// do your stuff
}
这将使 foreach 遍历由数组中的键而不是实际数组组成的数组。请注意,从性能角度来看,它可能并不是更好。
答案 1 :(得分:10)
请忽略此消息。
在PHP中,您使用foreach
的方式最快。是的,你应该避免使用未使用的变量,但是在这种情况下你无法避免它,而不会失去一些性能。
E.g。 foreach(array_keys($arr) as $key)
慢了约50%到60%
比foreach($arr as $key => $notUsed)
。
此问题的phpmd已经报告here,并且还有拉取请求here。
在更新phpmd之前,您还可以使用this little hack
在方法/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在foreach循环中的任何地方报告$notUsed
。
<强>更新强>
上面的建议假设PHP 5.6(撰写本答案时的相关版本)。但是时间过去了,现在使用PHP 7.2它似乎是另一种方式。与往常一样,它取决于确切的用例,但对于小于100.000键的关联数组,将array_keys($arr)
存储在变量中并在foreach循环中使用它会更快。
答案 2 :(得分:6)
是的,有一种更快捷的方法:http://php.net/manual/en/function.array-keys.php
答案 3 :(得分:2)
受到18C攻击:-)
在构造public class Foobar {
private HttpClient;
public Foobar(RequestConfig config, PoolingHttpClientConnectionManager, connManager) {
return HttpClients.custom()
.setDefaultRequestConfig(config)
.setConnectionManager(connManager)
.build();
}
public Foobarrr execute() {
HttpPost httpPost = new HttpPost("/blah");
HttpResponse response;
try {
response = httpClient.execute(httpPost);
else if (response.getEntity().getContent() != null && response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
return mapper.readValue(response.getEntity().getContent(), Foobarrr.class);
}
catch(Exception ex){
throw new RuntimeException(ex);
}
中,首先在PHP中分配$ value,然后分配$ key。
public void executeWithPooledUsingHttpClientBuilder() throws Exception {
try (CloseableHttpClient httpClient = HttpClients.custom()
.setMaxConnTotal(100)
.setMaxConnPerRoute(20)
.build()) {
final HttpGet httpGet = new HttpGet(GET_URL);
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
EntityUtils.consumeQuietly(response.getEntity());
}
}
输入您的代码
as $key=>$value
顺便说一句。请勿使用:$array=[1,3,6,10];
foreach($array as $k => $k)
print($k.'<br/>');
。它会破坏您的阵列。
答案 4 :(得分: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
)
答案 5 :(得分:1)
这是有效的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>
答案 6 :(得分: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;
}
答案 7 :(得分:0)
如果您使用的是XML规则集:
<rule ref="rulesets/unusedcode.xml/UnusedLocalVariable">
<properties>
<property name="allow-unused-foreach-variables" value="true" />
</properties>
</rule>