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

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

22.08.2008 13:47:43
Очень актуально для PHP 4; больше не актуально с PHP 5
Alex Shesterov 16.01.2015 20:53:01
Есть проект gitHub, который расширяет PHP7 поддержкой структур данных. Включает MAP, SET и т. Д. См . Дом разработчика здесь и ознакомьтесь с проектом GitHub здесь
Werner 7.07.2016 10:23:22
13 ОТВЕТОВ
РЕШЕНИЕ

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

http://www.php.net/array

Тем не менее, есть SPL, который является своего рода клоном C ++ STL.

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

54
22.10.2013 20:57:42
PHP массив на самом деле упорядоченный словарь. Он может использоваться для представления массивов, списков, очередей, стеков, деревьев, с использованием ссылок и даже графиков. Более того, это быстро. Что еще тебе надо?
Kamil Szot 18.01.2010 13:23:13
это поддерживает карты?
newday 8.11.2013 17:23:48
@newday: «Упорядоченный словарь» подразумевает «карту».
Sebastian Mach 3.02.2016 13:04:50

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

Например

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

/ Редактировать: Кроме того, посмотрите в руководстве .

6
22.08.2008 13:49:41

Массив PHP удваивается как список, так и словарь.

$myArray = array("Apples", "Oranges", "Pears");
$myScalar = $myArray[0] // == "Apples"

Или использовать его как ассоциативный массив:

$myArray = array("a"=>"Apples", "b"=>"Oranges", "c"=>"Pears");
$myScalar = $myArray["a"] // == "Apples"
6
22.08.2008 13:52:42

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

Массивы - они, безусловно, хорошо документированы и доступны в. ( 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.

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

4
22.08.2008 13:52:54

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

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

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

3
22.08.2008 13:53:41

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

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

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

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

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

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

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

15
22.08.2008 13:57:21

Вы всегда можете создать свой собственный, если не чувствуете, что 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;   
    }
}
3
9.04.2011 19:46:29
Больше не в сети на GitHub.
Kzqai 16.01.2015 20:19:14

Языки Си позволят создать структуру и затем заполнить ее как строковый (char / byte) буфер. Как только он заполнен, код обращается к буферу через члены структуры. Очень хорошо разбирать структурированные файлы (базы данных, изображения и т. Д.) Таким образом. Я не думаю, что вы можете сделать это со структурами PHP - или я (надеюсь) ошибаюсь.

Хорошо - ну, в PHP есть распаковка и упаковка - функционально то же самое, но не так элегантно.

-4
10.04.2012 20:50:31
Это не решает вопрос.
jrouquie 26.10.2012 08:27:45

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

29
30.01.2013 22:55:02

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

1
14.12.2013 14:57:16

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

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

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

Они не совсем как список или набор. Но массив может заменить это. Поэтому нет необходимости искать другие структуры данных.

0
4.07.2016 12:01:24

Да.

<?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

-1
4.07.2016 15:46:59

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

ds,

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

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

9
18.09.2016 17:59:05