2012-04-13 2 views
9

PHPプログラマとして、私はかなり多くのもののために配列を使います。私はSPLFixedArrayが特定の場合に有用であることを知っています。私はPHP arrays aren't very memory efficientを知っていますが、実際に私が必要とすることをするのに苦労しているケースはほとんどありません。データ構造としてPHPの配列型の特性は何ですか?

これは私がJavaで作業しているときとは対照的に、私が使用しているデータ構造と、それぞれの長所と短所を正確に理解することが絶対に重要だとわかっています。誰かが私がJavaのすべてのためにLinkedHashMapを使用するように提案した場合、彼らはビルから笑ってしまうでしょう。

PHPでこのような高速かつ緩やかなエンジニアリングをどのように取り除くことができますか? PHP配列の根底にある特質は何ですか?それはしばしば「順序付けられたマップ」と呼ばれますが、実装の多くは推測の余地が残ります。

いくつかの使用例PHP配列はが特に良いにありますか? PHP配列が実際にであると思われる、まったく正直なユースケースは、どれですか?でかなり悪いですか?

たとえば、高密度整数キー配列(たとえば$arr = array('a','b','c','d','e');)を順序付けされたハッシュマップよりもうまく処理すると仮定しますが、密と疎の境界はどこですか? $arr[10] = 'f';のような順序付けられていない1つのキーを導入すると、アレイの効率が大幅に低下するのですか? $arr[1000000] = 'g';はどうですか?私はPHPが約100万スロットを挿入していないと仮定しますが、カバーの下にリンクされたリストであれば、おそらく$arr[rand()] = rand();を繰り返し呼び出すと、各挿入後に並べ替えが必要になるでしょうか?

私が提起した具体的な質問に対処できない場合でも、PHP配列の基本的な内容を解説した回答は歓迎します。

+1

PHPがうまくいくことを誰も期待していないので、 –

+0

実際、[並べ替えはありません](http://codepad.org/V0Y9K9MZ)。存在しないキーに割り当てると、配列の最後に置かれます。 – Ryan

+6

誰かが同じ文章で 'PHP'と' strengths'を使った後、宇宙が再起動しなかったのに驚いています。 –

答えて

1

PHPの配列との根本的な問題は、彼らは2つの異なるデータタイプのマッシュアップしているということです。配列は、JavascriptまたはPythonは0から始まる数値でインデックス付けされたシンプルで順序付けられたリストです。理解しやすく使いやすい。マップ(別名辞書)は、キーと値のペアの(通常は順序付けられていない)コレクションです。再び、理解して使用するのは非常に簡単です。

PHP配列は、PHPの配列関数を使用する操作によって、予期しない動作をする可能性があります。配列キーは(例えば)文字列や整数にすることができますが、数字の文字列キーを持つことはできません。PHPはあなたが何をしていても強制的に整数に変換します。これは、異なるタイプの複数の類似した数字キーで終わる可能性があるため、(たとえば)JSONとの間でデータを変換するときに問題を引き起こす可能性があります。

PHPの開発者は、2つのデータ型を区別しておく必要があります。オンザフライマップを作成するために配列表記法を使用すると便利かもしれませんが、それを行ってはいけません。私はPythonの巨大なファンではありません(まだ...)が、リストとマップの正式な区別は、PHPよりも確かに優れていることです。

1

PHP配列は、任意の空間座標をモデリングするのに優れています。パーリンノイズ値(正、負など)のキャッシュを簡単に作成できます。

PHP配列は、設定オブジェクトを表すのに最適です。柔軟なキータイプは、これを簡単にします。

PHP配列は、キーとインデックスの違いについて混乱させます。ひどく。

PHP配列は一般的に遅いですが、PHP自体であっても実際には配列ではありませんが、常に必要以上に多くのオプションを提供します。これは、このような恐ろしい質問につながる:

PHP: Best way to iterate two parallel arrays?

ちょうど彼の配列を見てください。彼らは...彼らは何ですか?任意のパラメータリスト?

また、PHP配列は素晴らしいです!配列とマップ:

$class->call('func', Array(..params..)); 
+0

私は基本的なデータ構造についてもう少し議論することを望んでいましたが、あなたのご意見をお寄せいただきありがとうございます。 – dimo414

+0

@ dimo414なぜあなたは答えを受け入れたのですか? – k0pernikus

+0

6か月以上経ってもそれ以上のフィードバックはありませんでした。もしあなたがもっと欲しいと思うなら、私は削除します。 – dimo414

関連する問題