2014-11-06 3 views
4

내가 PHP로 펄에서 파일을 변환하고 펄의 한 줄을 번역,하지만 난이 라인에 도움이 필요 :
@stuff_unique = grep !$list{$_}++, @stuff;합니다.
나는 stuff_unique을 알고 있으며 stuff은 배열입니다.는 PHP

+1

'@ stuff_unique' (중복 제거)에서. – chilemagic

답변

7

이 공통 펄이 구성체 perlfaq4

에 기재된 관용구, @stuff_unique@stuff가 적어도 한번 보였다 항목 목록 끝날이고; 달리 말하면 반복이 없을 것이라는 점에서 고유 한 값만 남습니다. 작동 방식은 다음과 같습니다.

해시는 고유 키가있는 연관 배열과 같습니다. %list은 그러한 해시입니다. $list{something}은 'something'이라는 해시의 요소입니다. 그것의 가치는 당신이 그 안에 들어갈 수 있습니다.

grep@stuff의 항목을 반복합니다. stuff의 각 항목에 대해 해당 항목은 %list 해시의 해시 키로 사용됩니다. ++은 해시 요소에 해당하는 값을 증가시킵니다. 따라서 @stuff에 "1, 2, 1"이 포함 된 경우 첫 번째 반복에서 "1"이라는 해시 요소가 만들어집니다. 부울 false로 변환되는 값은 없습니다. 앞에있는 !은 불린 의미를 바꿉니다. 따라서 첫 번째 반복에서 '1'해시 요소의 거짓 값은 true로 평가되므로 요소는 @stuff_unique으로 전달됩니다. 마지막으로 사후 증가가 발생하므로 1 해시 요소에 저장된 값은 1로 증가합니다.

두 번째 요소에서 2도 아직 보이지 않으므로 통과하고 해당 해시 요소는 다음과 같습니다. 또한 1로 증가합니다.

세 번째 반복에서 '1'이 다시 표시됩니다. $list{1}은 이미 실제 값인 1과 같습니다. true는 거짓입니다. 그래서이 하나는 @stuff_unique으로 전달되지 않습니다.

@stuff의 요소를 하나씩이 방법으로 테스트합니다. 이전에 본 적이 있는지 여부를 감지하고, 그렇지 않은 경우 @stuff_unique으로 전달합니다.

PHP는 array_unique이라는 기능을 제공하며, 이는 동일한 작업을 수행해야합니다. 이것은 다음과 같이 사용됩니다 :

$stuff_unique = array_unique($stuff); 

다행히도 Perl 사람들에게는 선형 시간 연산입니다. 불행히도 PHP 사람들에게는 내부적으로 입력 배열을 정렬 한 다음 반복하면서 건너 뛴 채 반복됩니다. 즉, O(n + n log n) 작업 (O(n log n)으로 단순화 됨)을 의미합니다. 즉, 해당 구현은 일반적인 Perl 관용구뿐만 아니라 확장 할 수 없습니다.

+0

예, 감사합니다. 답변을 엄지 손가락으로 쥘 수는 없습니다. – Olsi

+0

@Olsi 엄지 손가락 업 및/또는 "수락"체크 표시에 대한 답변을 추가 또는 명확히해야하는 것이 있습니까? – DavidO

+0

@DavidO OP는 처음 질문을 게시했을 때 충분한 담당자가 없었습니다. –

2

PHP 클로저를 사용 기쁨

<?php 

$stuff = array(1,1,2,2,2,3,3,3); 

$list = array(); 
$stuff_unique = array_filter($stuff, function($_) use (&$list) { 
    return !$list[$_]++; 
}); 

print_r(array_values($stuff_unique)); 

또는

<?php 

$stuff = array(1,1,2,2,2,3,3,3); 
$stuff_unique = array_keys(array_flip($stuff)); 

print_r($stuff_unique); 

또는

$stuff_unique = array_values(array_unique($stuff)); 
그것은 배열 '@의 stuff` 모든 고유 라인을 발견하고이를 저장하는
+1

필자는 Perl 관용구를보다 직접적으로 번역했기 때문에이 점이 마음에 든다. +1. – DavidO

+0

@DavidO 예,하지만 PHP에서 PITA입니다. 나는'foreach'가 훨씬 더 잘 수행하고 PHP 커뮤니티에 익숙하다고 생각합니다. –

+0

첫 번째 문장과 관련하여 특정 기대에 도달하면 진실을 알 때 실망하지 않을 것입니다. ;) – DavidO