我正在将文件从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