哈希或映射在 PHP 中的工作方式


How a hash or mapping works in PHP

在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

我想找出在 php 中实现性能和效率的最佳方法

如果我

理解正确,您希望将您对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((。随意使用它们 - 作为核心功能,它们通常经过很好的优化!

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

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