复杂类型作为数组索引

5

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

PHP数组只能使用标量数据类型(如int、string、float、boolean、null)作为索引。我不能像其他语言那样将对象用作数组索引。那么我该如何实现对象->对象映射呢?

(我记得在这里看到过类似的东西,但具体不记得了,我的搜索创意已经用完了。)

4个回答

2

哈!不错。虽然不是那个,但似乎是最好的替代方案。句柄哈希看起来像指针;他们应该添加一个反转函数。 - mario

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

2

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

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


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

这基本上是 ArrayAccess 和一个用于键的离散数组以及一个用于值的离散数组。非常基础,但它允许:

$x = new FancyArray();

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接