PHP有内置的数据结构吗?

我正在查看PHP手册 ,而且我没有看到大多数语言所具有的数据结构部分,例如列表和集合。 我只是盲目或PHP没有这样的内置任何东西?

PHP中唯一的本地数据结构是数组。 幸运的是,数组非常灵活,也可以用作散列表。

http://www.php.net/array

但是,有一些SPL是C ++ STL的克隆。

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

PHP通过标准PHP库(SPL)基本扩展提供数据结构,该扩展可在PHP 5.0.0中默认使用和编译。

所提供的数据结构可用于PHP 5> = 5.3.0,包括:

双向链接列表

双链表(DLL)是双向链接到彼此的节点的列表。 迭代器的操作,对两端的访问,添加或删除节点的代价都是O(1),当底层结构是DLL的时候。 因此它为堆栈和队列提供了一个体面的实现。

  • SplDoublyLinkedList类
    • SplStack类
    • SplQueue类

堆是遵循堆属性的树状结构:每个节点大于或等于它的子节点,比较使用实现的比较方法,这个方法对堆是全局的。

  • SplHeap类
    • SplMaxHeap类
    • SplMinHeap类
  • SplPriorityQueue类

数组

数组是以连续的方式存储数据的结构,可通过索引访问。 不要将它们与PHP数组混淆:PHP数组事实上是作为有序的哈希表来实现的。

  • SplFixedArray类

地图

地图是包含键值对的数据结构。 PHP数组可以看作是从整数/string到值的映射。 SPL提供从对象到数据的映射。 这张地图也可以作为一个对象集使用。

  • SplObjectStorage类

资料来源: http : //php.net/manual/en/spl.datastructures.php

关联数组可以用于大多数基本的数据结构hashtable,queue,stack。 但是如果你想要一个像树或堆的东西,我不认为它们是默认存在的,但是我确定有任何地方都有免费的库。

要有一个数组模拟一个堆栈使用array_push()来添加和array_pop()起飞

要让一个数组模拟一个队列,可以使用array_push()来排队, array_shift()来排队

关联数组默认是一个哈希。 在PHP中,他们被允许有string作为索引,所以这个按预期工作:

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

最后,你可以模仿一个数组的二叉树,有可能浪费空间。 它是有用的,如果你知道你会有一个小树。 使用一个线性数组,你说对于任何索引(i)你把它的左边的子索引(2i + 1)和右边的子索引(2i + 2)。

本文将详细介绍所有这些方法,以使JavaScript数组模拟更高级别的数据结构。

PHP的数组实际上是关联数组,也可以作为集合使用。 像许多解释型语言一样,PHP提供所有这一切,而不是提供不同的显式数据types。

例如

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

/编辑:另外,看看手册 。

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

OOP – 根据版本的不同,可以devise和实现对象。 ( http://us.php.net/manual/en/language.oop.php )我不得不searchOOP在PHP网站上find这个。

希望有所帮助,如果没有的话,对不起。

当然PHP有数据结构。 在PHP中的数组非常灵活。 一些例子:

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

然后你有绝对多的数组函数可用于映射/过滤/走/等结构,或转换,翻转,反向等

如果您不觉得PHP包含特定types的数据结构,您可以随时创build自己的。 例如,下面是一个由数组支持的简单的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; } } 

虽然这个问题是8岁,我发布了一个答案,因为PHP 7引入了扩展名为ds提供专门的数据结构作为数组的替代。

ds

  • 使用Ds\命名空间。
  • 有3个接口,即CollectionSequenceHashable
  • 有8个类,即VectorDequeQueuePriorityQueueMapSetStackPair

欲了解更多信息结帐手册 ,也这个博客文章有一些很棒的信息,包括基准。

PHP也可以有一个称为“multidimensional array”或“matrix”的数组数组。 你可以有二维数组,三维数组等

对于数据结构的强制性需求,请浏览SPL (PHP扩展)。 他们有像堆,链表,..等数据结构…

PHP没有完整的列表和设置数据结构。 但是它们可以通过数组(具有n个Dimentions)来实现,这些数组提供了具有单个集群的多个数据

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

他们不完全一样列表或设置。 但是数组可以代替它。 所以不需要search另一个数据结构。

是的,它确实。

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

C语言将允许创build一个结构,然后像string(char / byte)缓冲区填充它。 一旦填充代码就通过结构成员访问缓冲区。 以这种方式parsing结构化(数据库,图像等)文件是非常好的。 我不认为你可以用PHP结构做到这一点 – 或者我(希望)是错的。

好的 – 那么PHP的确有解包和包装 – 在function上是一样的,但不够优雅。