PHP yerleşik mı veri yapıları?

11 Cevap php

Ben PHP Manual bakıyorum, ve ben böyle listeleri ve setleri gibi pek çok dil var veri yapıları, üzerinde bir bölüm göremiyorum. Ben sadece kör veya PHP yerleşik böyle bir şey yok?

11 Cevap

PHP sadece yerli veri yapısı dizidir. Neyse ki, diziler oldukça esnektir ve aynı zamanda karma bir tablo olarak kullanılabilir.

http://www.php.net/array

Ancak, C + + STL bir klonu tür SPL var.

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

Ilişkisel dizi en temel veri yapıları hashtable'a, kuyrukta, yığının için kullanılabilir. Eğer bir ağaç ya da yığın gibi bir şey istiyorum ama onlar varsayılan olarak mevcut ama özgür kütüphaneler her yerde vardır eminim sanmıyorum.

Bir dizi, bir yığın kullanımını array_push() eklemek ve array_pop() çıkarmak öykünmek zorunda

Bir dizi bir kuyruğu kullanımını array_push() enqueue ve array_shift() sıradan çıkarma taklit zorunda

Bir ilişkisel dizi varsayılan bir karma. PHP onlar beklendiği gibi çalışır böylece endeksler gibi dizeleri için izin verilir:

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

Son olarak, ne tür boşa boşluk olması potansiyeline sahip bir dizi ile bir ikili ağaç taklit edebilirsiniz. Eğer küçük bir ağaç olması için gidiyoruz biliyorum eğer onun yararlıdır. Herhangi indeksi (i) endeksi (2i +2) de dizin (2i +1) sol çocuk koymak ve sağ çocuk için doğrusal bir dizi kullanarak, diyorsunuz.

Bütün bu yöntemler JavaScript dizileri yüksek düzeyde veri yapılarını taklit yapmak için nasıl this article olarak güzel kaplıdır.

PHP hazır ve PHP 5.0.0 'da varsayılan olarak derlenmiş olan Standart PHP Kütüphanesi (SPL) temel uzantısı aracılığıyla veri yapıları sunmaktadır.

Sunulan veri yapıları PHP 5> = 5.3.0 mevcuttur ve şunları içerir:

Doubly Linked Lists

Bir çift bağlı listesi (DLL) birbirine göre her iki yönde bağlantılı bir düğüm listesi aşağıdadır. Temel yapısı bir DLL olduğunda Iterator operasyonları, biter, ek veya nodlarının çıkarılması hem erişim O (1) bir maliyeti var. Bu nedenle yığınları ve kuyruklar için iyi bir uygulama sağlar.

Heaps

Öbek küresel karşılaştırma uygulanan yöntemi kullanılarak karşılaştırıldığında her bir düğüm, daha büyük ya da çocuklara eşit: yığınları öbek özelliğini takip ağaç benzeri yapılardır.

Arrays

Diziler endeksler yoluyla erişilebilen sürekli bir şekilde veri depolamak yapılardır. PHP dizileri ile karıştırmayın: PHP diziler aslında sipariş hashtables olarak uygulanır.

Map

Bir harita anahtar-değer çiftlerini tutan bir datastructure olduğunu. PHP diziler değerlere tamsayılar / dizeleri haritalar gibi görülebilir. SPL nesnelerden veri için bir harita sağlar. Bu harita aynı zamanda bir nesne seti olarak kullanılabilir.

Source: http://php.net/manual/en/spl.datastructures.php

PHP aslında ilişkilendirilebilir diziler dizileri ve aynı zamanda kümeleri olarak da kullanılabilir. Birçok yorumlanır dil gibi, PHP yerine farklı kesin veri türleri sağlayan bir başlık altında tüm bu sunuyor.

Örneğin

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

/ Edit: Ayrıca, bir bak in the manual.

PHP'nin array bir liste ve bir sözlük olarak iki katına.

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

Ya da bir ilişkisel dizi olarak kullanmak için:

$myArray = array("a"=>"Apples", "b"=>"Oranges", "c"=>"Pears");
$myScalar = $myArray["a"] // == "Apples"

PHP veri yapısı belirli bir türünü içerir hissetmiyorum eğer zaman kendi oluşturabilirsiniz. Örneğin, burada bir dizi tarafından desteklenen basit Set veri yapısıdır.

ArraySet: https://github.com/abelperez/collections/blob/master/ArraySet.php

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;   
    }
}

Ben veri yapıları derken aklımda bir kaç yöne gider, biraz daha spesifik olmak isteyebilirsiniz düşünüyorum ...

Diziler - Onlar kesinlikle iyi içeri belgelenmiş ve mevcuttur (http://us.php.net/manual/en/book.array.php)

SQL Veri - Kullandığınız veritabanı bağlıdır, ancak çoğu mevcuttur. (http://us.php.net/manual/en/book.mysql.php)

OOP - versiyon nesnelere bağlı olarak dizayn ve uygulanabilir. (http://us.php.net/manual/en/language.oop.php) Ben php sitede bu bulmak için OOP için aramak zorunda kaldı.

Eğer bu olmuyorsa o, üzgünüm yardımcı olur umarım.

Tabii PHP veri yapıları vardır. Php dizi inanılmaz derecede esnektir. Bazı örnekler:

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

Sonra, vb / filtre / yürüyüş / etc yapıların harita veya dönüştürmek, çevirmek, tersine mevcut dizi fonksiyonları mutlak bir bolluk var

Hmm. Biraz zaten birleşmeli diziler hakkında bilmek. Ben bir web sitesinde kullanılan arama dizeleri bir dizi (non-ilişkisel) var gibi ben, setleri taklit biraz daha onlara bakmak gerekecek. Ben türüne (arama string) bir ilişkisel dizi çevirmek için gerekenleri tahmin => (kullanımların sayısı).

Teşekkürler.

Eğer yapabilseydim, Vincent ve Konrad upmods!

PHP de bir "çok boyutlu bir dizi" veya "matris" olarak adlandırılan bir array of arrays hangi olabilir. Vb 2-boyutlu diziler, 3-boyutlu diziler, olabilir

C dilleri bir yapısı oluşturma ve daha sonra bir dize (char / byte) tampon gibi dolgu sağlayacaktır. Bu dolu bir zamanlar kod yapısının üyeleri vasıtasıyla tampon erişir. Bu yapısal (veritabanı, resim, vb) ayrıştırmak için gerçekten güzel bu şekilde dosyaları. Ben PHP yapıları ile bunu yapabileceğimi sanmıyorum - ya da (umarım) yanlış duyuyorum.

Tamam - iyi PHP unpack ve paketi var - işlevsel aynı, ama zarif değil.