PHP中哈希表或映射是如何工作的

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

我想了解在中实现此操作的最佳性能和效率方法。


2
嗯,不冒犯,但这是一个相当牵强的例子。要在Perl和PHP中真正实现这一点,您只需使用字符串插值即可。您能想出一个更好的例子吗? - kojiro
2个回答

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())之类的内置功能。请随意使用它们-作为核心功能,它们通常已经非常优化!


感谢您的详细解释。 - hwnd

1

针对您正在做的事情,我更倾向于使用sprintf函数:

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

你链接的sprintf文档有几个带有代码的注释,应该实现一些基于键的sprintf - kojiro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接