Имеет ли PHP встроенные структуры данных?
Я смотрю на PHP Manual, и я не вижу раздела о структурах данных, которые есть в большинстве языков, таких как списки и наборы. Я просто слепой или PHP не имеет ничего подобного встроенного?
13 ответов:
единственная собственная структура данных в PHP-это массив. К счастью, массивы достаточно гибки и могут быть использованы в качестве хэш-таблиц.
однако, есть SPL, который является своего рода клоном C++ STL.
PHP предлагает структуры данных через стандартное расширение PHP Library (SPL) basic, которое доступно и скомпилировано по умолчанию в PHP 5.0.0.
предлагаемые структуры данных доступны с PHP 5 >= 5.3.0 и включают в себя:
Двусвязные Списки
двусвязный список (DLL) - это список узлов, связанных в обоих направлениях друг с другом. Операции итератора, доступ к обоим концам, добавление или удаление узлов стоимость за O(1) основной структура библиотеки DLL. Это, следовательно, обеспечивает достойную реализацию для стеков и очередей.
кучи
Heaps-это древовидные структуры, которые следуют за свойством кучи: каждый узел больше или равен своим дочерним узлам при сравнении с использованием реализованного метода сравнения, который является глобальным для кучи.
массивы
массивы-это структуры, которые хранят данные в непрерывном режиме, доступном через индексы. Не путайте их с PHP-массивами: PHP-массивы фактически реализуются как заказанные коллекция Hashtable.
карта
карта-это структура данных, содержащая пары ключ-значение. Массивы PHP можно рассматривать как карты от целых чисел/строк до значений. SPL предоставляет карту от объектов к данным. Эта карта также может быть использована в качестве набора объектов.
ассоциативный массив может использоваться для большинства базовых структур данных hashtable, queue, stack. Но если вы хотите что-то вроде дерева или кучи я не думаю, что они существуют по умолчанию, но я уверен, что есть бесплатные библиотеки где угодно.
чтобы массив эмулировал стек используйте
array_push()
добавитьarray_pop()
снятьчтобы массив эмулировал очередь используйте
array_push()
поставить в очередь иarray_shift()
в dequeueассоциативный массив является хэшем по умолчанию. В 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"
хотя этот вопрос 8 лет я публикую ответ, потому что PHP 7 вводит расширение под названием
ds
предоставление специализированных структур данных в качестве альтернативы массиву.The
ds
,
- использует
Ds\
пространство имен.- имеет 3 интерфейса, а именно:
Collection
,Sequence
иHashable
- имеет 8 классов, а именно,
Vector
,Deque
,Queue
,PriorityQueue
,Map
,Set
,Stack
, иPair
для получения дополнительной информации заказ руководство и этот блог имеет некоторую удивительную информацию, включая ориентиры.
Я думаю, что вы, возможно, захотите быть немного более конкретным, когда вы говорите, что структуры данных мой ум идет в нескольких направлениях...
массивы-они, безусловно, хорошо документированы и доступны. (http://us.php.net/manual/en/book.array.php)
данные SQL-зависит от используемой базы данных, но большинство из них доступны. (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 включает в себя определенный тип структуры данных. Например, вот простая структура данных набора, поддерживаемая массивом.
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; } }
PHP также может иметь массив массивов который называется "многомерным массивом"или " матрицей". Вы можете иметь 2-мерных массивов, 3-мерных массивов и т. д.
для обязательной необходимости структур данных, пожалуйста, найдите 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."; ?>
языки C позволят создать структуру, а затем заполнить ее как буфер строки (char/byte). Как только он заполнен, код обращается к буферу через элементы структуры. Очень приятно разбирать структурированные (базы данных, изображения и т. д.) файлы таким образом. Я не думаю, что вы можете сделать это с PHP-структуры - или я (надеюсь) ошибаюсь.
Ок-ну PHP имеет распаковать и упаковать-функционально то же самое, но не так элегантно.