复杂类型作为数组索引

时间:2010-10-28 23:17:16

标签: php

$ array [(object)$ obj] = $ other_obj;

PHP数组仅适用于具有标量数据类型的索引,如int,string,float,boolean,null。我不能像其他语言一样使用对象作为数组索引?那么如何实现对象 - >对象映射?

(虽然我在这里看过类似的东西,但是记不清楚,我的搜索创意已经过时了。)

4 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

如果您需要能够从密钥重新创建对象,则可以使用serialize($obj)作为密钥。要重新创建对象调用unserialize

答案 2 :(得分:2)

听起来你想要重新发现SplObjectStorage类,它可以提供从对象到其他数据的映射(在你的情况下,是其他对象)。

它实现了ArrayAccess接口,因此您甚至可以使用所需的语法,如$store[$obj_a] = $obj_b

答案 3 :(得分:1)

仍然没有找到原版,但记得实际的伎俩,所以我重新实现了它:
(我的互联网连接昨天给了我时间)

class FancyArray implements ArrayAccess {

    var $_keys = array();
    var $_values = array();

    function offsetExists($name) {
        return $this->key($name) !== FALSE;
    }

    function offsetGet($name) {
        $key = $this->key($name);
        if ($key !== FALSE) {
            return $this->_values[ $key ];
        }
        else {
            trigger_error("Undefined offset: {{$name}} in FancyArray __FILE__ on line __LINE__", E_USER_NOTIC
            return NULL;
        }
    }

    function offsetSet($name, $value) {
        $key = $this->key($name);
        if ($key !== FALSE) {
            $this->_values[$key] = $value;
        }
        else {
            $key = end(array_keys($this->_keys)) + 1;
            $this->_keys[$key] = $name;
            $this->_values[$key] = $value;
        }
    }

    function offsetUnset($name) {
        $key = $this->key($name);
        unset($this->_keys[$key]);
        unset($this->_values[$key]);
    }

    function key($obj) {
        return array_search($obj, $this->_keys);
    }
}

它基本上是ArrayAcces和一个用于键的贬值数组和一个用于值的数组。非常基本,但它允许:

$x = new FancyArray();

$x[array(1,2,3,4)] = $something_else;   // arrays as key

print $x[new SplFileInfo("x")];    // well, if set beforehand