71

我正在查看PHP Manual,但没有看到大多数语言都有的数据结构部分,例如列表和集合。我只是瞎了眼还是PHP没有内置这样的东西?

4

10 回答 10

60

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

http://www.php.net/array

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

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

于 2008-08-22T13:51:02.447 回答
33

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

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

双链表

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

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

数组

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

地图

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

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

于 2013-01-30T22:55:02.613 回答
19

PHP 7 引入了一个扩展,称为ds提供专用数据结构作为数组的替代方案。

ds, _

  • 使用Ds\命名空间。
  • 有 3 个接口,即Collection,SequenceHashable
  • 有 8 个类,即 , Vector, Deque, Queue, PriorityQueue, Map, Set,StackPair

有关更多信息,请查看手册这篇博文,其中包含一些很棒的信息,包括基准。

于 2016-09-18T13:22:23.273 回答
16

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

要让数组模拟堆栈,请使用array_push()添加和array_pop()起飞

让数组模拟队列,用于array_push()入队和array_shift()出队

默认情况下,关联数组是散列。在 PHP 中,它们被允许将字符串作为索引,因此可以按预期工作:

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

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

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

于 2008-08-22T13:57:21.513 回答
8

PHP有数组,实际上是关联数组,也可以作为集合使用。与许多解释型语言一样,PHP 在一个引擎盖下提供所有这些,而不是提供不同的显式数据类型。

例如

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

另外,看看手册

于 2008-08-22T13:49:41.157 回答
7

PHP 的数组兼作列表和字典。

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

或者将其用作关联数组:

$myArray = array("a"=>"Apples", "b"=>"Oranges", "c"=>"Pears");
$myScalar = $myArray["a"] // == "Apples"
于 2008-08-22T13:52:42.037 回答
5

我想你可能想要更具体一点,当你说数据结构时,我的想法有几个方向......

数组 - 它们当然有很好的文档记录并且可用。(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 网站上找到它。

于 2008-08-22T13:52:54.737 回答
3

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

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

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

于 2008-08-22T13:53:41.660 回答
3

如果您不觉得 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;   
    }
}
于 2011-04-09T19:46:29.190 回答
1

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

于 2013-12-14T14:57:16.203 回答