【问题标题】:PHP Using array keys to store dataPHP 使用数组键存储数据
【发布时间】:2016-07-20 16:39:24
【问题描述】:

假设我需要在数组中添加和删除元素,它们必须是唯一的。

Class A {
    protected $elements = [];

    function add($element) {
        if (!in_array($element, $this->elements)) {
            $this->elements[] = $element;
        }
    }

    function remove($element) {
        if (($key = array_search($element, $this->elements)) !== false) {
            unset($this->elements[$key]);
        }
    }
}

这看起来不错,但如果$elements 中有大量元素,PHP 将需要在每次调用add()remove() 时进行迭代。相反,我可以这样做:

Class A {
    protected $elements = [];

    function add($element) {
        $this->elements[$element] = true;
    }

    function remove($element) {
        unset($this->elements[$element]);
    }
}

无论元素数量如何,哪个应该以相同的速度执行,但我可能完全错了,这就是这个问题的重点。

我一直在我的代码中到处做这件事,但让我烦恼的是,我存储了一堆无用的信息(在这个例子中是一些 true 布尔值),这些信息完全没有用,但没有它们就不行.这似乎是某种缺陷,让我觉得这种方法并不像我想象的那样完全防弹。

这种将信息存储在数组中的方式是否比我认为正确的方式,第一个示例更好,除了存储不必要的信息之外,它有什么缺点吗? p>

【问题讨论】:

    标签: php arrays internal internals


    【解决方案1】:

    您的第二个解决方案将比第一个解决方案快得多。

    缺点是它会占用更多内存,并且您只能存储整数和字符串。

    如果您要对相当多的元素进行大量添加/删除操作,请使用第二种解决方案。

    如果您预计有数十万甚至数百万个元素 - 那么第二种解决方案可能会出现内存不足异常 - 所以您应该使用第一种。

    【讨论】:

    • 为什么第二种方案会占用更多内存?是因为散列键吗?
    • 是的,当 php 数组用作哈希表时 - 它们会占用更多内存
    • 但是顺序数组也是哈希表,为什么这样的数组会比关联数组占用更少的空间:?
    • 它们在后台的处理方式不同
    • 但是除非你有大量的元素,否则你永远不会遇到内存问题,所以第二种解决方案是完美的。
    猜你喜欢
    • 2016-07-29
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 2012-07-19
    • 2023-03-16
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多