Я смотрю на Руководство по PHP и не вижу раздела о структурах данных, которые есть в большинстве языков, таких как списки и наборы. Я просто слепой или в PHP нет ничего подобного?
Есть проект GitHub, который расширяет PHP7 за счет поддержки структур данных. Включает MAP, SET и т. д. См. Дом разработчика здесь и проверьте Проект GitHub здесь






В PHP есть массивы, которые на самом деле являются ассоциативными массивами, которые также могут использоваться как наборы. Как и многие интерпретируемые языки, PHP предлагает все это под одной крышей вместо того, чтобы предоставлять различные явные типы данных.
Например.
$lst = array(1, 2, 3);
$hsh = array(1 => "This", 2 => "is a", 3 => "test");
/ Edit: Также посмотрите в руководстве.
Единственная собственная структура данных в PHP - это массив. К счастью, массивы довольно гибкие и могут также использоваться как хеш-таблицы.
Однако есть SPL, который является своего рода клоном C++ STL.
http://www.php.net/manual/en/book.spl.php
Массив PHP - это фактически упорядоченный словарь. Его можно использовать для представления массивов, списков, очередей, стеков, деревьев с использованием ссылок и даже графов. Более того, это быстро. Чего еще можно хотеть?
поддерживает ли он карты?
@newday: «Упорядоченный словарь» подразумевает «карту».
Есть лучшее расширение для структур данных, начиная с PHP7 - DS stackoverflow.com/a/61698578/7082164
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)
ООП - В зависимости от версии могут быть разработаны и реализованы объекты. (http://us.php.net/manual/en/language.oop.php) Мне пришлось искать ООП, чтобы найти это на сайте php.
Надеюсь, что это поможет, извините, если нет.
Конечно, в PHP есть структуры данных. Массив в php невероятно гибкий. Некоторые примеры:
$foo = array(
'bar' => array(1,'two',3),
'baz' => explode(" ", "Some nice words")
);
Тогда у вас есть абсолютное множество функций массива, доступных для отображения / фильтрации / обхода / и т. д. Структур, или преобразования, переворота, реверса и т. д.
Ассоциативный массив может использоваться для большинства основных структур данных, хеш-таблицы, очереди, стека. Но если вам нужно что-то вроде дерева или кучи, я не думаю, что они существуют по умолчанию, но я уверен, что где-то есть бесплатные библиотеки.
Чтобы массив имитировал стек, используйте array_push() для добавления и array_pop() для взлета.
Чтобы массив имитировал очередь, используйте array_push() для постановки в очередь и array_shift() для удаления из очереди.
По умолчанию ассоциативный массив является хешем. В PHP им разрешено использовать строки в качестве индексов, поэтому это работает должным образом:
$array['key'] = 'value';
Наконец, вы можете сымитировать двоичное дерево с массивом, который потенциально может занимать лишнее пространство. Это полезно, если вы знаете, что у вас будет небольшое дерево. Используя линейный массив, вы говорите, что для любого индекса (i) вы помещаете его левый дочерний элемент в индекс (2i + 1), а правый дочерний элемент в индекс (2i + 2).
Все эти методы подробно описаны в Эта статья о том, как заставить массивы JavaScript эмулировать структуры данных более высокого уровня.
Вы всегда можете создать свою собственную, если не чувствуете, что 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;
}
}
Больше не в сети на github.
Языки C позволят создать структуру и затем заполнить ее как строковый (символьный / байтовый) буфер. После заполнения код обращается к буферу через элементы структуры. Таким образом действительно приятно анализировать структурированные файлы (базы данных, изображения и т. д.). Я не думаю, что вы можете сделать это с помощью структур PHP - или я (надеюсь) ошибаюсь.
Хорошо - что ж, PHP имеет распаковку и упаковку - функционально то же самое, но не так элегантно.
Это не решает вопрос.
PHP предлагает структуры данных через базовое расширение стандартной библиотеки PHP (SPL), которое доступно и скомпилировано по умолчанию в PHP 5.0.0.
Предлагаемые структуры данных доступны с PHP 5> = 5.3.0 и включают:
Двусвязный список (DLL) - это список узлов, связанных друг с другом в обоих направлениях. Операции итератора, доступ к обоим концам, добавление или удаление узлов имеют стоимость O (1), когда базовой структурой является DLL. Следовательно, он обеспечивает достойную реализацию для стеков и очередей.
Кучи представляют собой древовидные структуры, которые следуют свойству кучи: каждый узел больше или равен своим дочерним элементам при сравнении с использованием реализованного метода сравнения, который является глобальным для кучи.
Массивы - это структуры, которые непрерывно хранят данные, доступные через индексы. Не путайте их с массивами PHP: массивы PHP фактически реализованы в виде упорядоченных хэш-таблиц.
Карта - это структура данных, содержащая пары ключ-значение. Массивы PHP можно рассматривать как отображение целых чисел / строк в значения. SPL предоставляет карту от объектов к данным. Эту карту также можно использовать как набор объектов.
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.";
?>
Хотя этому вопросу уже 8 лет, я отправляю ответ, потому что PHP 7 представляет расширение ds, предоставляющее специализированные структуры данных в качестве альтернативы массиву.
ds,
Ds\.Collection, Sequence и HashableVector, Deque, Queue, PriorityQueue, Map, Set, Stack и PairДля получения дополнительной информации ознакомьтесь с Руководство, а также Это сообщение в блоге, где есть отличная информация, включая тесты.
На сегодняшний день (PHP 7.4) только нативной структурой является array. Но из расширения PHP7 появилось DS, которое включает новые структуры данных, и все они намного быстрее, чем другие реализации (включая SPL, рекомендованный в принятом ответе).
Расширение DS - Руководство по PHP
Интерфейсы: Collection, Hashable, Sequence
Классы: Vector, Deque, Map, Pair, Set, Stack, Queue, PriorityQueue
Очень актуально для PHP 4; больше не актуально с PHP 5