PHP 是否有内置的数据结构?

我正在研究 PHP 手册,没有看到关于大多数语言都有的数据结构的章节,比如列表和集合。我只是盲目或 PHP 没有任何这样的内置?

61231 次浏览

PHP 有数组,它们实际上是关联数组,也可以用作集合。与许多解释语言一样,PHP 在一个框架内提供了所有这些内容,而不是提供不同的显式数据类型。

例如。

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

还有,看看 在手册里

PHP 中唯一的本机数据结构是 array。幸运的是,数组非常灵活,也可以用作哈希表。

Http://www.php.net/array

然而,有一种 SPL 是 C + + STL 的克隆。

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

PHP 的 数组兼具列表和字典的功能。

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

或者把它用作关联数组:

$myArray = array("a"=>"Apples", "b"=>"Oranges", "c"=>"Pears");
$myScalar = $myArray["a"] // == "Apples"

我想你可能想要更具体一点,当你说数据结构,我的头脑在几个方向..。

数组-它们当然有很好的文档并且可以在

SQL 数据-取决于您正在使用的数据库,但大多数都是可用的

OOP-根据版本对象的不同可以设计和实现。(http://us.php.net/manual/en/language.oop.php)我必须搜索 OOP 才能在 php 站点上找到这个。

当然 PHP 也有数据结构,PHP 中的数组非常灵活,例如:

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

然后,您就有了大量的数组函数可用于映射/过滤/遍历/等结构,或者转换、翻转、反转等。

该关联数组可用于大多数基本数据结构散列表、队列、堆栈。但是如果你想要像树或堆这样的东西,我不认为它们是默认存在的,但是我肯定任何地方都有免费的库。

要使数组模拟堆栈,可以使用 array_push()进行添加,使用 array_pop()起飞

要让一个数组模拟一个队列,使用 array_push()进行排队,使用 array_shift()进行排队

默认情况下,关联数组是一个 hash。在 PHP 中,它们允许使用字符串作为索引,因此可以按照预期的方式工作:

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

最后,您可以使用可能浪费空间的数组来模拟二叉树。如果你知道你将会有一棵小树,这是很有用的。使用线性数组,对于任何索引(i) ,将其左子节点放在索引(2i + 1) ,右子节点放在索引(2i + 2)。

关于如何使 JavaScript 数组模拟更高级别的数据结构,这篇文章很好地涵盖了所有这些方法。

如果您觉得 PHP 不包含特定类型的数据结构,那么您总是可以创建自己的。例如,下面是一个由 Array 支持的简单 Set 数据结构。

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;
}
}

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

PHP 5 > = 5.3.0提供的数据结构包括:

双重连结清单

双向链表(dLL)是一个在两个方向上相互链接的节点列表。当底层结构是 DLL 时,迭代器的操作、对两端的访问、添加或删除节点的开销为 O (1)。因此,它为堆栈和队列提供了良好的实现。

很多

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

阵列

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

地图

Map 是保存键-值对的数据结构。PHP 数组可以看作是从整数/字符串到值的映射。SPL 提供了从对象到数据的映射。这个映射也可以用作对象集。

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

PHP 也可以有一个称为“多维数组”或“矩阵”的 数组的数组。你可以有二维数组,三维数组,等等。

PHP7引入了一个名为 ds的扩展,它提供了专门的数据结构作为数组的替代方案。

ds,

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

更多信息检查 手册这篇博文有一些令人敬畏的信息,包括基准。