2012-09-10 4 views
19

아마도 이해할 수없는 이론적 인 질문이지만 여전히 영리한 대답이있을 수 있습니다.키를 반환하는 PHP foreach는

배열을 반복하고 그 키를 얻고 그걸로 무언가를 얻고 싶습니다. 내가하는 일의 빠른 예 :

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

이제 PHP Mess Detector$value이 범위 내에서 사용되지 않는 것을 비명. 따라서 나는 이것이 아마도 에 array에 액세스하는 가장 좋은 방법이 아니라고 생각하고있었습니다.

array에서 불필요하게 불필요하게 꺼내는 방법을 생각해보십시오. ? 그것은 중요한 성능에 영향을 미칩니다 ... 아니면 아마도 나는 편집증에 빠졌고 어리석은 질문으로 누군가의 시간을 낭비하지 않고 계속해야합니다. :).

+0

정상입니다. 그러나 U는 이것을 사용할 수 있습니다 : $ keys = array_key ($ array); foreach ($ keys as $ key) { $ other_array [$ key] = '무언가'; } – Sergey

+0

http://phpmd.org/documentation/suppress-warnings.html – wkm

답변

37

당신의 키로 구성된 배열을 통해 foreach는으로 반복을 만들 것이

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

같은 것을 할 수있는 당신의 실제 배열 대신 배열. 그것은 성능 측면에서 보면별로 좋지 않다는 점에 유의하십시오.

+0

array_keys()는 여기에서 반복 할 때마다 호출되기 때문에 아마도 가장 현명한 방법이 아닐까요? –

+0

아니요 한 번 평가되면 foreach에 들어간 배열을 기억합니다. foreach (array ("a", "b", "c")를 $ letters처럼 사용하는 것) *는 모든 반복에서 새로운 배열을 생성하지 않는다. 그게 틀렸다면 foreach 앞에 $ keys 변수를 만듭니다 ... foreach가 각 반복에서 배열을 평가한다는 사실을 가리키는 참조가 있습니까? – inquam

+2

foreach()가 반복자를 사용하여 구현되므로 배열을 한 번만 반환하는 함수 만 호출합니다. 그런 다음 기존 결과 집합을 가리키는 반복자를 사용하여 각 항목을 계속 진행합니다. 그래서 foreach (array_keys() ... * – inquam

5

예,이 작업을 수행하는 빠른 방법이있다 : http://php.net/manual/en/function.array-keys.php

+0

+1은 돈을 받고 있지만 inquam은 훌륭한 예를 보여 주므로 전리품을 얻을 수 있습니다.) – RandomWhiteTrash

+1

초기 배열의 키 (array_keys가하는 것)를 포함하는 새로운 배열을 만드는 것이 더 빠름을 실제로 확신하지는 않습니다. 그러나 그것은 최소한 완료된 일을합니다. – inquam

+0

벤치 마크를 수행하지는 않았지만 질문자의 코드보다 빠르다고 생각합니다. 질문자는 새 배열도 작성합니다. array_keys()는 스크립팅 언어 자체를 사용하는 대신 최적화 된 방식으로 내부적으로 수행합니다 (희망 사항). – LeJared

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 
) 
+0

+1은 내가 생각한 바가 아니지만 - 예는 지나치게 단순화되었습니다.). 어쨌든 - 뭔가 새로운 것을 배우는 감사합니다 :) – RandomWhiteTrash

5

그냥이 메시지를 무시합니다.

PHP에서 사용하는 방법은 foreach입니다. 사용하지 않는 변수는 피하는 것이 좋지만,이 경우에는 성능을 잃지 않고 피할 수는 없습니다.

예. foreach(array_keys($arr) as $key)은 약 50 % ~ 60 % 느리다.
foreach($arr as $key => $notUsed)보다 느리다.

이 phpmd 문제는 이미 here으로보고되었으며 이미 풀 요청이 here입니다.

phpmd 당신은 또한 (내 경우에는 라인 (123)) 방법 collectVariables(..)에서 파일 /src/main/php/PHPMD/Rule/UnusedLocalVariable.php에서 this little hack

를 사용

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

에 의해

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

이 의지를 대체 할 수있는 업데이트 될 때까지 보고에서 phpmd를 중지하십시오 $notUsed어디서나 ach 루프.

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; 
}