微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将一行Perl转换为PHP

我正在将文件从Perl转换为 PHP,但我需要帮助这一行:
@stuff_unique = grep!$list {$_},@ material;.
我知道stuff_unique和东西是数组.

解决方法

这是常见的Perl习语,在 perlfaq4中描述

使用这个结构,@ material_unique将最终得到一个在@stuff中至少看过一次的项目列表;换句话说,在没有重复的意义上,它只保留唯一的值.它的工作方式是这样的:

Perl中的哈希就像一个具有唯一键的关联数组. %list就是这样的哈希. $list {something}是该hash中名为’something’的元素.它的价值可以是你放置的任何东西.

grep遍历@stuff中的项目.对于stuff中的每个项目,该项目将用作%list哈希中的哈希键.增加该对应哈希元素的值.因此,如果@stuff包含“1,2,1”,那么在第一次迭代时,将创建名为“1”的哈希元素.它没有值,转换为布尔值false.的!在前面颠倒布尔意义.因此,在第一次迭代中,’1’哈希元素的false值被计算为true,因此该元素将传递给@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习惯一样扩展.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐