配列とハッシュPHPの違いは何ですか?
配列:array(1,2,3...)
ハッシュ:array(key1=value1, key2=value2, ...)
それらは異なるのですか、それとも同じですか?
※例えば、関数の引数は配列がハッシュに対して有効になることを可能にしますか?
従来の言葉で区別して使っていたので戸惑いました。
配列とハッシュPHPの違いは何ですか?
配列:array(1,2,3...)
ハッシュ:array(key1=value1, key2=value2, ...)
それらは異なるのですか、それとも同じですか?
※例えば、関数の引数は配列がハッシュに対して有効になることを可能にしますか?
従来の言葉で区別して使っていたので戸惑いました。
あなたが説明しているのは両方とも配列です。2つの違いは、2番目のキーを明示的に設定していることです。そのため、これらは連想配列と呼ばれます。(Perl?)からハッシュ用語をどこから取得したかはわかりませんが、PHPではそうではありません。
したがって、たとえば、これを行う場合:
$foo = array(1,2,3,4,5);
print_r($foo);
出力は次のようになります。
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
ご覧のとおり、入力した個々の値にアクセスするためのキーはあなたのために作成されましたが、それでもあります。したがって、この配列は本質的に関連性もあります。配列の他の「タイプ」は、自動数値インデックスの代わりに「このキーでこの値にアクセスしたい」と明示的に言っていることを除いて、まったく同じ方法です(ただし、指定するキーは数値でもかまいません)。
$bar = array('uno' => 'one', 'dos' => 'two');
print_r($bar);
出力します:
Array
(
[uno] => one
[dos] => two
)
ご想像のとおり、実行print $bar['one']
するとが出力され、最初の例からuno
実行するとが出力されます。$foo[0]
1
関数に関する限り、PHP関数はほとんどの場合、これらの「タイプ」の配列のいずれかを使用して、必要な処理を実行しますが、一部の関数はインデックスに対してファンキーな処理を実行するため、注意が必要な違いがあります。いくつかはしません。配列のキーに応じて出力がどうなるかがわかるので、通常は配列関数を使用する前にドキュメントを読むのが最善です。
詳細については、マニュアルをお読みください。
エンジン php では、すべての配列 (連想配列または順次配列) がハッシュ テーブルになっています。これは、単一要素を読み取る最速の方法であるためです。内部的には、配列を作成および設定するための基本的な関数があります。
int zend_hash_init(HashTable *ht, uint nSize,hash_func_t pHashFunction, dtor_func_t pDestructor, zend_bool persistent);
int zend_hash_add(HashTable *ht, char *arrKey, uinit nKeySize, void *pData, uinit nDataSize, void **pDest)
int zend_hash_update(HashTable *ht, char *arrKey, uinit nKeySize, void *pData, uinit nDataSize, void **pDest)
int zend_hash_index_update(HashTable *ht, ulong h, void *pDate, uinit nDataSize, void **pDest)
int zend_hash_next_index_insert(HashTable *ht, void *pData, uinit nDataSize, void **pDest)
int zend_hash_add(HashTable *ht, char *arrKey, uinit nKeySize, void *pData, uinit nDataSize, void **pDest)
int zend_hash_update(HashTable *ht, char *arrKey, uinit nKeySize, void *pData, uinit nDataSize, void **pDest)
int zend_hash_index_update(HashTable *ht, ulong h, void *pDate, uinit nDataSize, void **pDest)
int zend_hash_next_index_insert(HashTable *ht, void *pData, uinit nDataSize, void **pDest)
……
実際には、php には配列はありません。連想配列のみがあります (これは基本的にハッシュ テーブルです)。
やってみる
$ar=array("zero","one","two","three","four");
unset($ar[3]);
そうすることで配列から「3」が削除されますが、配列キー (配列は連想ではありません) は同じ (0,1,2,4) のままであることがわかります。通常の言語では、キーの番号が付け直されます。 「4」から3の場合。