我正在查看PHP Manual,但没有看到大多数语言都有的数据结构部分,例如列表和集合。我只是瞎了眼还是PHP没有内置这样的东西?
10 回答
PHP 中唯一的原生数据结构是数组。幸运的是,数组非常灵活,也可以用作哈希表。
但是,有一种 SPL,它是 C++ STL 的一种克隆。
PHP 通过标准 PHP 库 (SPL) 基本扩展提供数据结构,该扩展在 PHP 5.0.0 中默认可用并编译。
提供的数据结构可用于 PHP 5 >= 5.3.0,包括:
双链表
双向链接列表 (DLL) 是双向链接的节点列表。当底层结构是 DLL 时,迭代器的操作、对两端的访问、添加或删除节点的成本为 O(1)。因此,它为堆栈和队列提供了一个不错的实现。
堆
堆是遵循堆属性的树状结构:每个节点大于或等于其子节点,当使用实现的比较方法进行比较时,该方法对堆来说是全局的。
数组
数组是以连续方式存储数据的结构,可通过索引访问。不要将它们与 PHP 数组混淆:PHP 数组实际上是作为有序哈希表实现的。
地图
映射是保存键值对的数据结构。PHP 数组可以看作是从整数/字符串到值的映射。SPL 提供了从对象到数据的映射。该地图也可以用作对象集。
关联数组可用于大多数基本数据结构 hashtable、queue、stack。但是,如果您想要树或堆之类的东西,我认为它们默认不存在,但我确信任何地方都有免费的库。
要让数组模拟堆栈,请使用array_push()
添加和array_pop()
起飞
让数组模拟队列,用于array_push()
入队和array_shift()
出队
默认情况下,关联数组是散列。在 PHP 中,它们被允许将字符串作为索引,因此可以按预期工作:
$array['key'] = 'value';
最后,您可以用可能浪费空间的数组来模拟二叉树。如果您知道您将拥有一棵小树,它会很有用。使用线性数组,您说对于任何索引 (i),您将其左孩子放在索引 (2i+1) 处,将右孩子放在索引 (2i+2) 处。
本文很好地介绍了所有这些方法,关于如何使 JavaScript 数组模拟更高级别的数据结构。
PHP有数组,实际上是关联数组,也可以作为集合使用。与许多解释型语言一样,PHP 在一个引擎盖下提供所有这些,而不是提供不同的显式数据类型。
例如
$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 - 可以根据版本设计和实现对象。( 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")
);
然后你有绝对过多的数组函数可用于映射/过滤/遍历/等结构,或转换、翻转、反转等。
如果您不觉得 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 也可以有一个数组数组,称为“多维数组”或“矩阵”。你可以有二维数组、3维数组等。