Hash 散列或映射在PHP中的工作方式

Hash 散列或映射在PHP中的工作方式,hash,php,regex,hashmap,Hash,Php,Regex,Hashmap,在Perl语言中,我将a定义为一个事物和另一个事物之间的映射或基本元素列表。如文件中所述。。 散列是一种基本数据类型。它使用键访问其内容 所以基本上一个散列和一个数组很接近。它们的初始化看起来非常相似 如果我要用Perl创建一个映射,我可以像下面这样进行比较 my %map = ( A => [qw(a b c d)], B => [qw(c d f a)], C => [qw(b d a e)], ); my @keys = keys %m

在Perl语言中,我将a定义为一个事物和另一个事物之间的映射或基本元素列表。如文件中所述。。 散列是一种基本数据类型。它使用键访问其内容

所以基本上一个散列和一个数组很接近。它们的初始化看起来非常相似

如果我要用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

我想找出在

中实现性能和效率的最佳方法对于您正在做的事情,我更愿意使用:


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

在PHP中,“Perl散列”通常被称为“关联数组”,PHP将其实现为一个数组,碰巧有键作为索引,其值与常规数组类似。请查看,以获取大量关于PHP如何使用这种(和其他)类型的数组的示例

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

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

要回答与示例相关的问题,请执行以下操作:

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

2) 至于最有效的,就代码行和脚本执行开销而言……好吧,对于PHP来说,使用这样的映射是一个非常小的任务。我不认为任何其他处理方法会有多大影响,PHP可以毫无怨言地处理成千上万的问题。另一方面,如果可以避免使用正则表达式

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

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


PHP不会做任何愚蠢的事情,比如仅仅因为您想使用键值对而创建大量开销,它有许多内置功能,比如
foreach$yourray as$key=>$value
以及您使用的函数,比如array_keys()和array_values()。请随意使用它们-作为核心功能,它们通常都经过了非常好的优化

嗯,无意冒犯,但这是一个相当做作的例子。要在perl和php中真正做到这一点,只需使用字符串插值。你能想出一个更好的例子吗?你链接到的
sprintf
文档中有几个注释,其中的代码应该实现某种基于键的sprintf。谢谢你的详细解释。
$format = 'Hello %s how are you. Hey %s, hi %s!';
printf($format, 'foo', 'bar', 'baz');