71

PHP Manualを見ていますが、リストやセットなど、ほとんどの言語にあるデータ構造に関するセクションがありません。私は盲目なだけですか、それとも PHP にはこのようなものが組み込まれていませんか?

4

10 に答える 10

60

PHP の唯一のネイティブ データ構造は配列です。幸いなことに、配列は非常に柔軟で、ハッシュ テーブルとしても使用できます。

http://www.php.net/array

ただし、C++ STL の一種のクローンである SPL があります。

http://www.php.net/manual/en/book.spl.php

于 2008-08-22T13:51:02.447 に答える
33

PHP は、PHP 5.0.0 でデフォルトで使用およびコンパイルされる標準 PHP ライブラリ (SPL) の基本的な拡張機能を介してデータ構造を提供します。

提供されるデータ構造は、PHP 5 >= 5.3.0 で使用でき、以下が含まれます。

双方向リンク リスト

二重リンク リスト (DLL) は、相互に双方向にリンクされたノードのリストです。基になる構造体が DLL の場合、反復子の操作、両端へのアクセス、ノードの追加または削除には O(1) のコストがかかります。したがって、スタックとキューの適切な実装を提供します。

ヒープ

ヒープは、ヒープ プロパティに従うツリーのような構造です。ヒープに対してグローバルな実装された比較メソッドを使用して比較すると、各ノードはその子以上です。

配列

配列は、データを継続的に格納する構造であり、インデックスを介してアクセスできます。これらを PHP 配列と混同しないでください。実際、PHP 配列は順序付きハッシュテーブルとして実装されています。

地図

マップは、キーと値のペアを保持するデータ構造です。PHP 配列は、整数/文字列から値へのマップと見なすことができます。SPL は、オブジェクトからデータへのマップを提供します。このマップは、オブジェクト セットとしても使用できます。

ソース: http://php.net/manual/en/spl.datastructures.php

于 2013-01-30T22:55:02.613 に答える
19

dsPHP 7 では、配列の代わりに特殊なデータ構造を提供するという拡張機能が導入されました。

ds、_

  • Ds\名前空間を使用します。
  • Collection、 、Sequenceおよびの 3 つのインターフェイスがあります。Hashable
  • VectorDequeQueue、 、PriorityQueueMapの8 つのクラスがあります。SetStackPair

詳細については、マニュアルをチェックしてください。また、このブログ投稿には、ベンチマークを含むいくつかの素晴らしい情報があります。

于 2016-09-18T13:22:23.273 に答える
16

連想配列は、ほとんどの基本的なデータ構造のハッシュテーブル、キュー、スタックに使用できます。しかし、ツリーやヒープのようなものが必要な場合は、デフォルトでは存在しないと思いますが、無料のライブラリがどこにでもあると確信しています。

配列でスタックをエミュレートするには、array_push()add とarray_pop()take off を使用します

配列でキューをエミュレートするには、array_push()エンキューとarray_shift()デキューに使用します

連想配列は、デフォルトではハッシュです。PHP では、文字列をインデックスとして使用できるため、これは期待どおりに機能します。

$array['key'] = 'value';

最後に、スペースを浪費する可能性のある配列を使用して、二分木をエミュレートすることができます。小さな木を作ることがわかっている場合に便利です。線形配列を使用して、任意のインデックス (i) に対して、左の子をインデックス (2i+1) に、右の子をインデックス (2i+2) に配置するとします。

これらのメソッドはすべて、JavaScript 配列でより高いレベルのデータ構造をエミュレートする方法に関するこの記事でうまくカバーされています。

于 2008-08-22T13:57:21.513 に答える
8

PHP には配列があります。これは実際には連想配列であり、セットとしても使用できます。多くのインタープリター言語と同様に、PHP は、さまざまな明示的なデータ型を提供する代わりに、これらすべてを 1 つのフードの下で提供します。

例えば

$lst = array(1, 2, 3);
$hsh = array(1 => "This", 2 => "is a", 3 => "test");

また、マニュアルを参照してください。

于 2008-08-22T13:49:41.157 に答える
7

PHP の配列は、リストと辞書の両方を兼ねています。

$myArray = array("Apples", "Oranges", "Pears");
$myScalar = $myArray[0] // == "Apples"

または、連想配列として使用するには:

$myArray = array("a"=>"Apples", "b"=>"Oranges", "c"=>"Pears");
$myScalar = $myArray["a"] // == "Apples"
于 2008-08-22T13:52:42.037 に答える
5

データ構造と言うと、私の心はいくつかの方向に向かいます...

配列 - それらは確かに十分に文書化されており、で利用できます。 ( 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 を検索する必要がありました。

于 2008-08-22T13:52:54.737 に答える
3

もちろん、PHP にはデータ構造があります。PHP の配列は非常に柔軟です。いくつかの例:

$foo = array(
  'bar' => array(1,'two',3),
  'baz' => explode(" ", "Some nice words")
);

次に、構造をマップ/フィルター/ウォーク/などしたり、変換、反転、反転などに使用できる配列関数が大量にあります。

于 2008-08-22T13:53:41.660 に答える
3

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;   
    }
}
于 2011-04-09T19:46:29.190 に答える
1

PHP は、「多次元配列」または「行列」と呼ばれる配列の配列を持つこともできます。2 次元配列、3 次元配列などを使用できます。

于 2013-12-14T14:57:16.203 に答える