سؤال

أنا أنظر إلى دليل PHP, ، ولا أرى قسمًا عن هياكل البيانات الموجودة في معظم اللغات، مثل القوائم والمجموعات.هل أنا مجرد أعمى أم أن لغة PHP لا تحتوي على أي شيء مثل هذا مدمجًا؟

هل كانت مفيدة؟

المحلول

بنية البيانات الأصلية الوحيدة في PHP هي المصفوفة.لحسن الحظ، المصفوفات مرنة جدًا ويمكن استخدامها كجداول تجزئة أيضًا.

http://www.php.net/array

ومع ذلك، هناك SPL وهو نوع من استنساخ C++ STL.

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

نصائح أخرى

تقدم PHP هياكل البيانات من خلال الامتداد الأساسي لمكتبة PHP القياسية (SPL)، والذي يتوفر ويتم تجميعه افتراضيًا في PHP 5.0.0.

تتوفر هياكل البيانات المقدمة مع PHP 5 >= 5.3.0، وتتضمن:

القوائم المرتبطة بشكل مضاعف

القائمة المرتبطة بشكل مضاعف (DLL) هي قائمة من العقد المرتبطة في كلا الاتجاهين ببعضها البعض.إن عمليات التكرار، والوصول إلى كلا الطرفين، وإضافة العقد أو إزالتها لها تكلفة O(1) عندما تكون البنية الأساسية عبارة عن DLL.ومن ثم فهو يوفر تطبيقًا لائقًا للمكدسات وقوائم الانتظار.

أكوام

الأكوام هي هياكل شبيهة بالشجرة تتبع خاصية الكومة:كل عقدة أكبر من أو تساوي أبنائها، عند مقارنتها باستخدام طريقة المقارنة المطبقة والتي تكون عمومية بالنسبة للكومة.

المصفوفات

المصفوفات هي هياكل تقوم بتخزين البيانات بطريقة مستمرة، ويمكن الوصول إليها عبر الفهارس.لا تخلط بينها وبين مصفوفات PHP:يتم في الواقع تنفيذ صفائف PHP كجداول تصنيف مرتبة.

خريطة

الخريطة عبارة عن بنية بيانات تحتوي على أزواج قيمة المفتاح.يمكن رؤية صفائف PHP كخرائط من الأعداد الصحيحة/السلاسل إلى القيم.يوفر SPL خريطة من الكائنات إلى البيانات.يمكن أيضًا استخدام هذه الخريطة كمجموعة كائنات.

مصدر: http://php.net/manual/en/spl.datastructures.php

يمكن استخدام المصفوفة النقابية لمعظم هياكل البيانات الأساسية القابلة للتجزئة وقائمة الانتظار والمكدس.ولكن إذا كنت تريد شيئًا مثل شجرة أو كومة، فلا أعتقد أنها موجودة بشكل افتراضي ولكني متأكد من وجود مكتبات مجانية في أي مكان.

لجعل المصفوفة تحاكي استخدام المكدس array_push() لإضافة و array_pop() للاقلاع

للحصول على صفيف يحاكي استخدام قائمة الانتظار array_push() لسرد و array_shift() إلى قائمة الانتظار

المصفوفة النقابية هي تجزئة بشكل افتراضي.في PHP، يُسمح لهم بالحصول على سلاسل كفهارس بحيث يعمل هذا كما هو متوقع:

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

أخيرًا، يمكنك محاكاة شجرة ثنائية تحتوي على مصفوفة من المحتمل أن تؤدي إلى إهدار مساحة.سيكون مفيدًا إذا كنت تعلم أنه سيكون لديك شجرة صغيرة.باستخدام مصفوفة خطية، تقول لأي فهرس (i) أنك تضع فرعه الأيسر عند الفهرس (2i+1) وطفله الأيمن عند الفهرس (2i+2).

يتم تغطية كل هذه الأساليب بشكل جيد هذا المقال حول كيفية جعل صفائف JavaScript تحاكي هياكل البيانات ذات المستوى الأعلى.

على الرغم من أن هذا السؤال عمره 8 سنوات، إلا أنني أقوم بنشر إجابة لأن PHP 7 يقدم امتدادًا يسمى ds توفير هياكل البيانات المتخصصة كبديل للمصفوفة.

ال ds,

  • يستخدم Ds\ مساحة الاسم.
  • لديه 3 واجهات وهي،Collection, Sequence و Hashable
  • لديه 8 فئات وهي، Vector, Deque,Queue, PriorityQueue, Map, Set, Stack, ، و Pair

لمزيد من المعلومات الخروج من يدوي و أيضا هذا بلوق وظيفة لديه بعض المعلومات رهيبة بما في ذلك المعايير.

تحتوي لغة PHP على مصفوفات هي في الواقع مصفوفات ترابطية ويمكن استخدامها أيضًا كمجموعات.مثل العديد من اللغات المترجمة، تقدم PHP كل هذا تحت غطاء واحد بدلاً من توفير أنواع بيانات صريحة مختلفة.

على سبيل المثال

$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) اضطررت إلى البحث عن OOP للعثور على هذا على موقع php.

نأمل أن يساعد، آسف إذا لم يكن الأمر كذلك.

بالطبع PHP لديها هياكل البيانات.المصفوفة في PHP مرنة بشكل لا يصدق.بعض الأمثلة:

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

ثم لديك عدد كبير من وظائف المصفوفة المتاحة لتعيين/تصفية/المشي/إلخ للهياكل، أو التحويل، والقلب، والعكس، وما إلى ذلك.

يمكنك دائمًا إنشاء البنية الخاصة بك إذا كنت لا تشعر أن PHP تتضمن نوعًا معينًا من بنية البيانات.على سبيل المثال، إليك بنية مجموعة بيانات بسيطة مدعومة بمصفوفة.

مجموعة الصفيف: 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;   
    }
}

يمكن أن تحتوي PHP أيضًا على ملف مصفوفة من المصفوفات وهو ما يسمى "مصفوفة متعددة الأبعاد" أو "مصفوفة".يمكن أن يكون لديك مصفوفات ثنائية الأبعاد ومصفوفات ثلاثية الأبعاد وما إلى ذلك.

لتلبية الحاجة الإجبارية لهياكل البيانات، يرجى تصفح الملف SPL(امتدادات PHP).لديهم هياكل بيانات مثل الكومة، والقائمة المرتبطة، ..إلخ...

PHP لا تحتوي على القائمة وتعيين هياكل البيانات بالضبط.ولكن يمكن تحقيقها عن طريق المصفوفة (مع n الأبعاد)، التي توفر البيانات المتعددة مع مجموعة واحدة

$variable = array(
  'one' => array(1,'char',3),
  'two' => explode("single", "Multiple strings"),
  'three' => all(9,'nine',"nine")
);

فهي ليست بالضبط كقائمة أو مجموعة.لكن المصفوفة يمكن أن تحل محل ذلك.لذلك لا حاجة للبحث عن هياكل بيانات أخرى.

نعم إنها كذلك.

<?php
$my_array = array("Bird","Cat","Cow");

list($a, $b, $c) = $my_array;
echo "I have several animals, a $a, a $b and a $c.";
?>

http://www.w3schools.com/php/func_array_list.asp

ستسمح لغات C بإنشاء بنية ثم تعبئتها مثل المخزن المؤقت لسلسلة (char/byte).بمجرد ملئه، يصل الكود إلى المخزن المؤقت عبر أعضاء البنية.من الجيد حقًا تحليل الملفات المنظمة (قاعدة البيانات، الصور، وما إلى ذلك) بهذه الطريقة.لا أعتقد أنه يمكنك فعل ذلك باستخدام هياكل PHP - أم أنني (آمل) مخطئ.

حسنًا - حسنًا، PHP لديها خاصية التفريغ والتعبئة - وهي نفس الوظيفة، ولكنها ليست بنفس الأناقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top