我正在將文件從Perl轉換爲PHP,但我需要此行的幫助:
@stuff_unique = grep !$list{$_}++, @stuff;
。我知道stuff_unique
和stuff
是數組。將Perl的一行轉換爲PHP
回答
這是一種常見的Perl成語,在perlfaq4
描述用該構建體,@stuff_unique
將結束與在@stuff
被視爲至少一次的項目的列表;換句話說,它只剩下唯一的價值,就是說不會有重複。它的工作方式是這樣的:
Perl中的散列就像一個具有唯一鍵的關聯數組。 %list
就是這樣一個散列。 $list{something}
是名爲「something」的哈希中的一個元素。它的價值可以是任何你在其中放置的東西。
grep
遍歷@stuff
中的項目。對於stuff
中的每個項目,該項目在%list
散列中用作散列鍵。 ++
遞增該相應散列元素的值。因此,如果@stuff
包含「1,2,1」,那麼在第一次迭代中將創建名爲「1」的哈希元素。它沒有價值,這轉化爲布爾假。前面的!
顛倒了布爾意義。因此,在第一次迭代中,'1'散列元素的假值被評估爲真,以便元素通過至@stuff_unique
。最後,發生後增量,因此1
散列元素中保存的值增加爲1.
在第二個元素上,2還沒有被看到,所以它通過,其相應的散列元素是也遞增到1.
在第三次迭代中,再次看到'1'。 $list{1}
已經等於1
,這是一個真正的價值。 !真是假的;所以這一個不通過@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));
- 1. 將行轉換爲使用Perl的列
- 2. 將PHP轉換爲Perl校驗和
- 3. 將perl代碼轉換爲php? (2)
- 4. 將Perl轉換爲Ruby Regex
- 5. perl將H:MM:SS轉換爲MM.MMMM
- 6. 將.htaccess(PHP)行轉換爲web.config行(IIS)
- 7. 將此perl替換轉換爲python
- 8. 將單行轉換爲perl中的多行
- 9. 轉換一個Perl代碼PHP
- 10. .xlsx轉換爲Perl中的xml轉換
- 11. Perl解釋器:將'\ n'轉換爲換行符?
- 12. 將1行PHP代碼轉換爲VB.NET
- 13. 將多個SQL行轉換爲一行
- 14. 將3行轉換爲一行
- 15. SQL Server:將行轉換爲一行
- 16. 如何將一行轉換爲兩行?
- 17. 將一行轉換爲多行Oracle
- 18. 將VB6代碼轉換爲PHP轉換
- 19. 將C#的一行轉換爲VB.net
- 20. 將Java的一行轉換爲C#
- 21. 將Java中的一行轉換爲c#
- 22. 將C#中的一行轉換爲C?
- 23. 將一些AS函數轉換爲php
- 24. SQL - 將一對多轉換爲一行
- 25. perl的轉換XLS爲xml
- 26. perl的轉換XSD爲xml
- 27. 如何將AsciiDoc轉換爲Perl POD?
- 28. 在Perl中將字節轉換爲MB
- 29. Perl - 將PC UTF-8轉換爲PC ANSI
- 30. 如何將Perl bigrat轉換爲bignum?
它是找到陣列'@ stuff'的所有唯一線和將其存儲在'@ stuff_unique'中(刪除重複項)。 – chilemagic 2014-11-06 16:12:36