2013-10-13 2 views
3

На языке Perl я определяю как сопоставление между одной вещью и другой или существенным списком элементов. Как указано в документации .. Хэш - это базовый тип данных. Он использует ключи для доступа к его содержимому.Как работает хэш или сопоставление в PHP

Таким образом, в основном хэш близок к массиву. Их инициализации даже выглядят очень похожими.

Если бы я должен был создать сопоставление в 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

+0

См. Обновленное правление – hwnd

ответ

4

Если я понимаю, правильно, вы хотите применить свои знания хешей Perl к PHP. Если я прав, то ...

В PHP «Perl hash» обычно называют «ассоциативным массивом», а 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 ​​(). Не стесняйтесь использовать их - в качестве основных функций они, как правило, довольно хорошо проработаны!

+0

Спасибо за подробное объяснение. – hwnd

1

За то, что вы делаете, я предпочел бы использовать sprintf:

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

В документе 'sprintf', к которому вы ссылаетесь, есть несколько комментариев с кодом, который должен реализовать какой-то sprintf на основе ключей. – kojiro

Смежные вопросы