散列或映射如何在PHP中工作

时间:2013-10-13 03:15:30

标签: php regex hash hashmap

在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

我想在

中找到最佳方法来提高性能和效率

2 个答案:

答案 0 :(得分:4)

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

在PHP中,“Perl哈希”通常称为“关联数组”,PHP将其实现为一个恰好将键作为索引并且其值与常规数组类似的数组。查看PHP Array docs,了解有关PHP如何使用此(和其他)类型数组的示例。

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

哲学上,哈希或地图只是将离散的相关信息保存在一起的一种方式。这就是所有大多数非原始数据结构,并且PHP对于你如何处理事情并不十分自以为是;它有许多内置的优化,并且能够有效地完成这些类型的事情。

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

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

2)至于最有效率,就代码行和脚本执行开销而言......好吧,使用这样的映射对于PHP来说是一个非常小的任务。我认为处理它的任何其他方式都不重要,PHP可以成千上万地处理它而无需投诉。现在,如果你可以避免使用正则表达式,那么......

3)你正在使用它,真的。不要过度思考 - 在PHP中,这只是一个“数组”,就是这样。它是一个包含任意数量元素的变量,PHP处理多维或相关性非常好。好吧,它几乎永远不会成为你遇到任何问题的原因。

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

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

答案 1 :(得分:1)

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

$format = 'Hello %s how are you. Hey %s, hi %s!';
printf($format, 'foo', 'bar', 'baz');