Имеет ли PHP встроенные структуры данных?

Я смотрю на Руководство 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 и включают в себя:

Двусторонние списки

Doubly Linked List (DLL) – это список узлов, связанных в обоих направлениях друг с другом. Операции Iterator, доступ к обоим концам, добавление или удаление узлов имеют стоимость O (1), когда базовая структура является DLL. Следовательно, он обеспечивает достойную реализацию стеков и очередей.

  • Класс SplDoublyLinkedList
    • Класс SplStack
    • Класс SplQueue

Кучи

Кучи – это древовидные структуры, которые следуют за свойством кучи: каждый узел больше или равен его дочерним элементам при сравнении с использованием реализованного метода сравнения, который является глобальным для кучи.

  • Класс SplHeap
    • Класс SplMaxHeap
    • Класс SplMinHeap
  • Класс SplPriorityQueue

Массивы

Массивы – это структуры, которые хранят данные в непрерывном режиме, доступные через индексы. Не путайте их с массивами PHP: массивы PHP фактически реализованы как упорядоченные хеш-таблицы.

  • Класс SplFixedArray

карта

Карта представляет собой структуру данных, содержащую пары ключ-значение. Массивы PHP можно рассматривать как карты от целых чисел / строк до значений. SPL предоставляет карту от объектов к данным. Эта карта также может использоваться как набор объектов.

  • Класс SplObjectStorage

Источник: http://php.net/manual/en/spl.datastructures.php

Ассоциативный массив может использоваться для большинства базовых структур данных хэш-таблицы, очереди, стека. Но если вы хотите что-то вроде дерева или кучи, я не думаю, что они существуют по умолчанию, но я уверен, что в любом месте есть бесплатные библиотеки.

Чтобы массив эмулировал стек, используйте array_push() для добавления и array_pop() чтобы снять

Чтобы массив эмулировал очередь, используйте array_push() для enqueue и array_shift() для удаления из очереди

По умолчанию ассоциативный массив является хешем. В PHP им разрешено иметь строки как индексы, поэтому это работает так, как ожидалось:

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

Наконец, вы можете эмулировать двоичное дерево с массивом, имеющим потенциал для использования впустую пространства. Это полезно, если вы знаете, что у вас будет небольшое дерево. Используя линейный массив, вы говорите, что для любого индекса (i) вы помещаете его левый дочерний элемент в индекс (2i + 1) и правый ребенок по индексу (2i + 2).

Все эти методы хорошо описаны в этой статье о том, как сделать JavaScript-массивы эмулировать структуры данных более высокого уровня.

PHP имеет массивы, которые на самом деле являются ассоциативными массивами, а также могут использоваться в качестве наборов. Как и многие интерпретируемые языки, PHP предлагает все это под одним капюшоном вместо предоставления разных явных типов данных.

Например

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

/ Edit: Также ознакомьтесь с руководством .

Массив 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 Data – зависит от используемой вами базы данных, но большинство из них доступно. ( http://us.php.net/manual/en/book.mysql.php )

ООП – в зависимости от объектов версии могут быть разработаны и реализованы. ( http://us.php.net/manual/en/language.oop.php ) Мне пришлось искать ООП, чтобы найти это на сайте php.

Надеюсь, что это поможет, извините, если это не так.

Конечно, PHP имеет структуры данных. Массив в php невероятно гибкий. Некоторые примеры:

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

Тогда у вас есть абсолютное множество функций массива, доступных для отображения / фильтрации / ходьбы / и т. Д. Структур, или конвертирования, переворота, реверса и т. Д.

Вы всегда можете создать свой собственный, если не чувствуете, что PHP включает определенный тип структуры данных. Например, вот простая структура данных Set, поддерживаемая массивом.

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

Хотя этот вопрос составляет 8 лет, я отправляю ответ, потому что PHP 7 представляет расширение, называемое ds предоставляющее специализированные структуры данных в качестве альтернативы массиву.

ds ,

  • использует пространство имен Ds\ .
  • имеет 3 интерфейса, а именно: Collection , Sequence и Hashable
  • имеет 8 классов, а именно: Vector , Deque , Queue , PriorityQueue , Map , Set , Stack и Pair

Для получения дополнительной информации ознакомьтесь с руководством, а также в этом сообщении в блоге есть некоторые потрясающие сведения, включая контрольные показатели.

PHP также может иметь массив массивов, который называется «многомерным массивом» или «матрицей». Вы можете иметь 2-мерные массивы, 3-мерные массивы и т. Д.

Для обязательной необходимости структур данных, пожалуйста, найдите SPL (PHP Extensions). У них есть структуры данных, такие как куча, связанный список, и т. Д. …

PHP не имеет списка и точно устанавливает структуры данных. но они могут быть достигнуты с помощью массива (с n Dimentions), которые обеспечивают множественные данные одним кластером

 $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 имеет распаковку и пакет – функционально то же самое, но не так элегантно.