3

在 Perl 语言中,我将定义为一个事物与另一个事物之间的映射,或者一个基本元素列表。如文档中所述。 哈希是一种基本数据类型。它使用密钥来访问其内容。

所以基本上哈希接近数组。他们的初始化甚至看起来非常相似。

如果我要在 Perl 中创建一个映射,我可以做如下的比较。

my %map = (
     A => [qw(a b c d)],
     B => [qw(c d f a)],
     C => [qw(b d a e)], 
); 

my @keys = keys %map;
my %matches;

for my $k ( 1 .. @keys ) {
   $matches{$_} |= 2**$k for @{$map{ $keys[$k-1] }};
}

for ( sort keys %matches ) {
   my @found;
   for my $k ( 1 .. @keys ) {
      push @found, $keys[$k-1] if $matches{$_} & 2**$k;
   }
   print "$_ found in ", (@found? join(',', @found) : 0 ), "\n";
} 

Output:
a found in A,C,B
b found in A,C
c found in A,B
d found in A,C,B
e found in C
f found in B

我想找出在

4

2 回答 2

4

如果我理解正确,您希望将您对 Perl 哈希的知识应用于 PHP。如果我是对的,那么...

在 PHP 中,“Perl 哈希”通常称为“关联数组”,PHP 将其实现为一个数组,该数组恰好有键作为索引,它的值就像一个常规数组。查看PHP Array 文档以获取有关 PHP 如何让您使用这种(和其他)类型的数组的大量示例。

PHP 的好处是它在处理数组方面非常灵活。您可以将数组定义为具有键值对,然后将其视为常规数组并忽略键,这样就可以了。你可以混搭......它不会抱怨太多。

从哲学上讲,散列或映射只是将离散的相关信息保持在一起的一种方式。这就是大多数非原始数据结构的全部内容,PHP 对您如何处理事情并不是很固执;它有很多内置的优化,并且在有效地完成这些类型的事情方面做得非常好。

要回答与您的示例相关的问题:

1)至于简单性(我认为您的意思)和可维护性,我认为您使用关联数组没有任何问题。如果数据集是成对的,那么键值对是表达这类数据的一种自然方式。

2) 至于最有效的,就代码行和脚本执行开销而言……嗯,使用这种映射对于 PHP 来说是一个微不足道的小任务。我认为任何其他处理它的方式都不会很重要,PHP 可以毫无怨言地处理数千个。现在,如果你可以避免使用正则表达式,另一方面......

3)你正在使用它,真的。不要想太多——在 PHP 中这只是一个“数组”,仅此而已。它是一个包含任意数量元素的变量,PHP 可以很好地处理多维或关联性。好吧,它几乎永远不会成为您遇到任何问题的原因。

PHP 将非常合乎逻辑且有效地在幕后处理诸如哈希/映射之类的事情,以至于语言的全部要点的一部分是让您不必费心去考虑这些事情。如果您将数据块关联到块中,请使用数组;如果数据是成对出现的,则使用键值对;如果是十几个,请使用“数组数组”(一个多维数组,其中部分或全部元素是数组)。

PHP 不会因为你想使用键值对而做任何愚蠢的事情,比如创建大量开销,它有很多内置功能,比如foreach $yourArray as $key => $value你使用的函数,比如 array_keys() 和 array_values()。随意使用它们 - 作为核心功能,它们通常非常优化!

于 2013-10-13T03:45:26.703 回答
1

对于您正在做的事情,我宁愿使用sprintf

$format = 'Hello %s how are you. Hey %s, hi %s!';
printf($format, 'foo', 'bar', 'baz');
于 2013-10-13T03:21:07.850 回答