PHP Manualを見ていますが、リストやセットなど、ほとんどの言語にあるデータ構造に関するセクションがありません。私は盲目なだけですか、それとも PHP にはこのようなものが組み込まれていませんか?
10 に答える
PHP の唯一のネイティブ データ構造は配列です。幸いなことに、配列は非常に柔軟で、ハッシュ テーブルとしても使用できます。
ただし、C++ STL の一種のクローンである SPL があります。
PHP は、PHP 5.0.0 でデフォルトで使用およびコンパイルされる標準 PHP ライブラリ (SPL) の基本的な拡張機能を介してデータ構造を提供します。
提供されるデータ構造は、PHP 5 >= 5.3.0 で使用でき、以下が含まれます。
双方向リンク リスト
二重リンク リスト (DLL) は、相互に双方向にリンクされたノードのリストです。基になる構造体が DLL の場合、反復子の操作、両端へのアクセス、ノードの追加または削除には O(1) のコストがかかります。したがって、スタックとキューの適切な実装を提供します。
ヒープ
ヒープは、ヒープ プロパティに従うツリーのような構造です。ヒープに対してグローバルな実装された比較メソッドを使用して比較すると、各ノードはその子以上です。
配列
配列は、データを継続的に格納する構造であり、インデックスを介してアクセスできます。これらを PHP 配列と混同しないでください。実際、PHP 配列は順序付きハッシュテーブルとして実装されています。
地図
マップは、キーと値のペアを保持するデータ構造です。PHP 配列は、整数/文字列から値へのマップと見なすことができます。SPL は、オブジェクトからデータへのマップを提供します。このマップは、オブジェクト セットとしても使用できます。
連想配列は、ほとんどの基本的なデータ構造のハッシュテーブル、キュー、スタックに使用できます。しかし、ツリーやヒープのようなものが必要な場合は、デフォルトでは存在しないと思いますが、無料のライブラリがどこにでもあると確信しています。
配列でスタックをエミュレートするには、array_push()
add とarray_pop()
take off を使用します
配列でキューをエミュレートするには、array_push()
エンキューとarray_shift()
デキューに使用します
連想配列は、デフォルトではハッシュです。PHP では、文字列をインデックスとして使用できるため、これは期待どおりに機能します。
$array['key'] = 'value';
最後に、スペースを浪費する可能性のある配列を使用して、二分木をエミュレートすることができます。小さな木を作ることがわかっている場合に便利です。線形配列を使用して、任意のインデックス (i) に対して、左の子をインデックス (2i+1) に、右の子をインデックス (2i+2) に配置するとします。
これらのメソッドはすべて、JavaScript 配列でより高いレベルのデータ構造をエミュレートする方法に関するこの記事でうまくカバーされています。
PHP には配列があります。これは実際には連想配列であり、セットとしても使用できます。多くのインタープリター言語と同様に、PHP は、さまざまな明示的なデータ型を提供する代わりに、これらすべてを 1 つのフードの下で提供します。
例えば
$lst = array(1, 2, 3);
$hsh = array(1 => "This", 2 => "is a", 3 => "test");
また、マニュアルを参照してください。
PHP の配列は、リストと辞書の両方を兼ねています。
$myArray = array("Apples", "Oranges", "Pears");
$myScalar = $myArray[0] // == "Apples"
または、連想配列として使用するには:
$myArray = array("a"=>"Apples", "b"=>"Oranges", "c"=>"Pears");
$myScalar = $myArray["a"] // == "Apples"
データ構造と言うと、私の心はいくつかの方向に向かいます...
配列 - それらは確かに十分に文書化されており、で利用できます。 ( http://us.php.net/manual/en/book.array.php )
SQL データ - 使用しているデータベースによって異なりますが、ほとんどが利用可能です。( http://us.php.net/manual/en/book.mysql.php )
OOP - バージョンに応じて、オブジェクトを設計および実装できます。( http://us.php.net/manual/en/language.oop.php ) php サイトでこれを見つけるには、OOP を検索する必要がありました。
もちろん、PHP にはデータ構造があります。PHP の配列は非常に柔軟です。いくつかの例:
$foo = array(
'bar' => array(1,'two',3),
'baz' => explode(" ", "Some nice words")
);
次に、構造をマップ/フィルター/ウォーク/などしたり、変換、反転、反転などに使用できる配列関数が大量にあります。
PHP に特定のタイプのデータ構造が含まれていないと思われる場合は、いつでも独自のデータ構造を作成できます。たとえば、これは配列に基づく単純な Set データ構造です。
class ArraySet
{
/** Elements in this set */
private $elements;
/** the number of elements in this set */
private $size = 0;
/**
* Constructs this set.
*/
public function ArraySet() {
$this->elements = array();
}
/**
* Adds the specified element to this set if
* it is not already present.
*
* @param any $element
*
* @returns true if the specified element was
* added to this set.
*/
public function add($element) {
if (! in_array($element, $this->elements)) {
$this->elements[] = $element;
$this->size++;
return true;
}
return false;
}
/**
* Adds all of the elements in the specified
* collection to this set if they're not already present.
*
* @param array $collection
*
* @returns true if any of the elements in the
* specified collection where added to this set.
*/
public function addAll($collection) {
$changed = false;
foreach ($collection as $element) {
if ($this->add($element)) {
$changed = true;
}
}
return $changed;
}
/**
* Removes all the elements from this set.
*/
public function clear() {
$this->elements = array();
$this->size = 0;
}
/**
* Checks if this set contains the specified element.
*
* @param any $element
*
* @returns true if this set contains the specified
* element.
*/
public function contains($element) {
return in_array($element, $this->elements);
}
/**
* Checks if this set contains all the specified
* element.
*
* @param array $collection
*
* @returns true if this set contains all the specified
* element.
*/
public function containsAll($collection) {
foreach ($collection as $element) {
if (! in_array($element, $this->elements)) {
return false;
}
}
return true;
}
/**
* Checks if this set contains elements.
*
* @returns true if this set contains no elements.
*/
public function isEmpty() {
return count($this->elements) <= 0;
}
/**
* Get's an iterator over the elements in this set.
*
* @returns an iterator over the elements in this set.
*/
public function iterator() {
return new SimpleIterator($this->elements);
}
/**
* Removes the specified element from this set.
*
* @param any $element
*
* @returns true if the specified element is removed.
*/
public function remove($element) {
if (! in_array($element, $this->elements)) return false;
foreach ($this->elements as $k => $v) {
if ($element == $v) {
unset($this->elements[$k]);
$this->size--;
return true;
}
}
}
/**
* Removes all the specified elements from this set.
*
* @param array $collection
*
* @returns true if all the specified elemensts
* are removed from this set.
*/
public function removeAll($collection) {
$changed = false;
foreach ($collection as $element) {
if ($this->remove($element)) {
$changed = true;
}
}
return $changed;
}
/**
* Retains the elements in this set that are
* in the specified collection. If the specified
* collection is also a set, this method effectively
* modifies this set into the intersection of
* this set and the specified collection.
*
* @param array $collection
*
* @returns true if this set changed as a result
* of the specified collection.
*/
public function retainAll($collection) {
$changed = false;
foreach ($this->elements as $k => $v) {
if (! in_array($v, $collection)) {
unset($this->elements[$k]);
$this->size--;
$changed = true;
}
}
return $changed;
}
/**
* Returns the number of elements in this set.
*
* @returns the number of elements in this set.
*/
public function size() {
return $this->size;
}
/**
* Returns an array that contains all the
* elements in this set.
*
* @returns an array that contains all the
* elements in this set.
*/
public function toArray() {
$elements = $this->elements;
return $elements;
}
}
PHP は、「多次元配列」または「行列」と呼ばれる配列の配列を持つこともできます。2 次元配列、3 次元配列などを使用できます。