Я смотрю Руководство по PHP, и я не вижу раздел о структурах данных, которые имеют большинство языков, например списки и устанавливает. Я просто слепой или у PHP нет ничего подобного?
Имеет ли PHP встроенные структуры данных?
Ответ 1
Единственная собственная структура данных в PHP - это массив. К счастью, массивы довольно гибкие и могут также использоваться в качестве хеш-таблиц.
Однако существует SPL, который является своего рода клоном С++ STL.
Ответ 2
PHP предлагает структуры данных через базовое расширение стандартной библиотеки PHP (SPL), которое доступно и скомпилировано по умолчанию в PHP 5.0.0.
Предлагаемые структуры данных доступны с PHP 5 >= 5.3.0 и включают в себя:
Дважды связанные списки
A Doubly Linked List (DLL) - это список узлов, связанных в обоих направлениях друг с другом. Операции итераторов, доступ к обоим концам, добавление или удаление узлов имеют стоимость O (1), когда базовая структура является DLL. Поэтому он обеспечивает достойную реализацию стеков и очередей.
Кучи
Кучи - это древовидные структуры, которые следуют за свойством heap: каждый node больше или равен своим дочерним элементам при сравнении с использованием реализованного метода сравнения, который является глобальным для кучи.
Массивы
Массивы - это структуры, которые хранят данные в непрерывном режиме, доступные через индексы. Не путайте их с массивами PHP: массивы PHP фактически реализованы как упорядоченные хэш-таблицы.
Карта
Карта представляет собой структуру данных, содержащую пары ключевых значений. Массивы PHP можно рассматривать как карты от целых чисел/строк до значений. SPL предоставляет карту от объектов к данным. Эта карта также может использоваться как набор объектов.
Ответ 3
Ассоциативный массив может использоваться для большинства базовых структур данных хэш-таблицы, очереди, стека. Но если вы хотите что-то вроде дерева или кучи, я не думаю, что они существуют по умолчанию, но я уверен, что там есть бесплатные библиотеки.
Чтобы массив эмулировал использование стека, array_push()
добавить и array_pop()
снять
Чтобы массив эмулировал очередь, используйте array_push()
для очереди и array_shift()
для удаления из очереди
По умолчанию ассоциативный массив является хешем. В PHP им разрешено иметь строки как индексы, поэтому это работает так, как ожидалось:
$array['key'] = 'value';
Наконец, вы можете как-то эмулировать двоичное дерево с массивом с потенциалом потерять пространство. Это полезно, если вы знаете, что у вас будет небольшое дерево. Используя линейный массив, вы говорите, что для любого индекса (i) вы помещаете его левый дочерний элемент в индекс (2i + 1) и правый дочерний элемент с индексом (2i + 2).
Все эти методы хорошо описаны в в этой статье о том, как сделать JavaScript-массивы эмулировать структуры данных более высокого уровня.
Ответ 4
В PHP есть массивы, которые на самом деле являются ассоциативными массивами и могут также использоваться как наборы. Как и многие интерпретируемые языки, PHP предлагает все это под одним капюшоном вместо предоставления разных явных типов данных.
например.
$lst = array(1, 2, 3);
$hsh = array(1 => "This", 2 => "is a", 3 => "test");
/Edit: Также посмотрите в руководстве.
Ответ 5
PHP array удваивается как список, так и словарь.
$myArray = array("Apples", "Oranges", "Pears");
$myScalar = $myArray[0] // == "Apples"
Или использовать его как ассоциативный массив:
$myArray = array("a"=>"Apples", "b"=>"Oranges", "c"=>"Pears");
$myScalar = $myArray["a"] // == "Apples"
Ответ 6
Я думаю, вы можете захотеть быть более конкретным, когда вы говорите о структурах данных, мой разум идет в нескольких направлениях...
Массивы - они, безусловно, хорошо документированы и доступны. (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.
Надеюсь, что это поможет, извините, если это не так.
Ответ 7
Конечно, PHP имеет структуры данных. Массив в php невероятно гибкий. Некоторые примеры:
$foo = array(
'bar' => array(1,'two',3),
'baz' => explode(" ", "Some nice words")
);
Затем у вас есть абсолютное множество функций массива, доступных для отображения/фильтрации/ходьбы/etc структур, или конвертирования, переворота, реверса и т.д.
Ответ 8
Вы всегда можете создать свой собственный, если не чувствуете, что 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 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;
}
}
Ответ 9
Хотя этот вопрос составляет 8 лет, я отправляю ответ, потому что PHP 7 представляет расширение, называемое ds
, предоставляющее специализированные структуры данных в качестве альтернативы массиву.
ds
,
- использует пространство имен
Ds\
. - имеет 3 интерфейса, а именно
Collection
,Sequence
иHashable
- имеет 8 классов:
Vector
,Deque
,Queue
,PriorityQueue
,Map
,Set
,Stack
иPair
Для получения дополнительной информации просмотрите Manual, а также Это сообщение в блоге содержит некоторую потрясающую информацию, включая контрольные показатели.
Ответ 10
PHP также может иметь массив массивов, который называется "многомерным массивом" или "матрицей". Вы можете иметь 2-мерные массивы, 3-мерные массивы и т.д.
Ответ 11
Для обязательной необходимости структур данных, пожалуйста, найдите SPL (PHP Extensions). У них есть структуры данных, такие как куча, связанный список, и т.д....
PHP не имеет списка и точно устанавливает структуры данных. но они могут быть достигнуты с помощью массива (с n Dimentions), которые предоставляют несколько данных с одним кластером
$variable = array(
'one' => array(1,'char',3),
'two' => explode("single", "Multiple strings"),
'three' => all(9,'nine',"nine")
);
Они не соответствуют списку или набору. Но массив может заменить это. Поэтому нет необходимости искать другие структуры данных.
Ответ 12
Да, да.
<?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.";
?>
Ответ 13
ЯзыкиC позволят создать структуру, а затем заполнить ее как буфер строки (char/byte). После заполнения кода доступ к буферу осуществляется через элементы структуры. Это очень приятно разбирать структурированные (базы данных, изображения и т.д.) Файлы таким образом. Я не думаю, что вы можете сделать это с помощью структур PHP - или я (надеюсь) неправильно.
Хорошо - ну PHP имеет распаковку и пакет - функционально то же самое, но не так элегантно.