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

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

Очень актуально для PHP 4; больше не актуально с PHP 5

Alex Shesterov 16.01.2015 23:53

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

Werner 07.07.2016 13:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
62
2
52 302
14
Перейти к ответу Данный вопрос помечен как решенный

Ответы 14

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

Например.

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

/ Edit: Также посмотрите в руководстве.

Ответ принят как подходящий

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

http://www.php.net/array

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

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

Массив PHP - это фактически упорядоченный словарь. Его можно использовать для представления массивов, списков, очередей, стеков, деревьев с использованием ссылок и даже графов. Более того, это быстро. Чего еще можно хотеть?

Kamil Szot 18.01.2010 16:23

поддерживает ли он карты?

newday 08.11.2013 21:23

@newday: «Упорядоченный словарь» подразумевает «карту».

Sebastian Mach 03.02.2016 16:04

Есть лучшее расширение для структур данных, начиная с PHP7 - DS stackoverflow.com/a/61698578/7082164

Jsowa 09.05.2020 17:48

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.

Kzqai 16.01.2015 23:19

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

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

Это не решает вопрос.

jrouquie 26.10.2012 12:27

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

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.";
?>

http://www.w3schools.com/php/func_array_list.asp

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

ds,

  • использует пространство имен Ds\.
  • имеет 3 интерфейса, а именно Collection, Sequence и Hashable
  • имеет 8 классов, а именно Vector, 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

Оригинальная статья о расширении

Другие вопросы по теме