내가 PHP로 펄에서 파일을 변환하고 펄의 한 줄을 번역,하지만 난이 라인에 도움이 필요 :
@stuff_unique = grep !$list{$_}++, @stuff;
합니다.
나는 stuff_unique
을 알고 있으며 stuff
은 배열입니다.는 PHP
는 PHP
답변
이 공통 펄이 구성체 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 관용구뿐만 아니라 확장 할 수 없습니다.
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` 모든 고유 라인을 발견하고이를 저장하는
'@ stuff_unique' (중복 제거)에서. – chilemagic