2009-08-25 7 views
7

PHP配列の型は、実際には従来のC配列よりも順序付けされたマップに似ています。それはPHPのオリジナルの汎用データ構造です。マニュアルは遠くまでThe indexed and associative array types are the same type in PHP, which can both contain integer and string indicesと言います。PHPの「関連」配列と「インデックス」配列の実用的な違いは何ですか?

しかし、組み込みの言語機能では、「インデックス付き」配列(シーケンシャルな整数キーを持つ配列)と「連想配列」(非シーケンシャルおよび/またはキーの配列が区別されます)混合型)。

この例の1つはarray_mergeです。

入力配列に同じ文字列キーがある場合、そのキーの後の値は前の値を上書きします。ただし、配列に数値キーが含まれている場合、後の値は元の値を上書きしませんが、追加されます。

配列が1つしかなく、配列の数値がインデックスされている場合、キーは連続的に再インデックスされます。

PHPでは、インデックス付き配列と結合配列が区別される他の場所は何ですか?私は特にUserlandの違いに興味がありますが、PHPのソースで実装されたArrayについての洞察も興味深いでしょう。

答えて

3

頭に浮かぶ最も普及している一つは(それが数字のインデックスを持っていないため)インデックス付きの配列は1ができない連想一方で、伝統的なforループを使用しての上にループすることができるということである。

for ($i = 0; $i < count($indexed_array); $i++) 
{ 
    // do something with $indexed_array[$i] 
} 

もちろん、phpにはforeachというキーワードもあり、両方のタイプで同じように動作します。

+1

+1良い情報ですが、next()関数を使用してインデックス付き配列と関連配列の両方をループすることができます。言い換えれば、連想配列は依然として順序の内部概念を持っています。 –

+1

真で、それらの行に沿って、インデックス付き配列は必ずしも予期された順序を持つ必要はありません - むしろ、配列が使用する順序( 'foreach'または' next() ')は、したがって、$ arr [3]が$ arr [2]の前に設定されていた場合、その順序は反復処理されたときに保持されます。 –

0

ほとんどすべてのコアソート機能(すべてのキーの関連付けを維持するかどうかによって、sortksortasortのバリエーションがあります)。

5

実際には、どの配列も、索引付けされていても結合されていても、PHPのハッシュテーブル(要素の順序を維持するための二重リンクリスト)です。しかし、ユーザランドのPHPコードでは、インデックス付き配列と連想配列はほとんどいつも異なる目的を果たし、異なる方法で扱う必要があるため、便宜上、sort/asortのようないくつかの関数を区別します。

+0

+1実装とユーザランドコードの区別。 –

3

..そして、5.3から始まるSplFixedArrayがあります。これは整数インデックスのみをサポートし、固定サイズであり、一般にネイティブ配列よりも高速です。

+2

+1情報には興味がありますが、標準のPHPライブラリ配列オブジェクトは、既存のPHP配列関数と互換性がないことに注意してください。これは古い手を刺激することがあります。 –

2

私が見つけた1つの興味深い違いは、json_encodeを使用した場合です。

json_encode(array(0=>0,1=>1,2=>2)); 
> [0,1,2] 
json_encode(array(0=>0,2=>2)); 
> {"0":0,"2":2} 

は唯一の例として、これは理にかなっているが、それはarray_filter、たとえば、と組み合わせると、より多くの驚きです。

$f = function($x) { return $x != 1; }; 
json_encode(array_filter(array(0,1,2), $f)); 
> {"0":0,"2":2} 

いくつかの要素をフィルタリングした数値配列から始めましたが、結果として生じるjsonは連想配列です。


我々はarray_valuesを使用することによって、所望のJSONを取得することができます。

関連する問題