代码之家  ›  专栏  ›  技术社区  ›  mario

复杂类型作为数组索引

php
  •  4
  • mario  · 技术社区  · 14 年前

    PHP数组只处理具有标量数据类型(如int、string、float、boolean、null)的索引。我不能像在其他语言中那样使用对象作为数组索引?那么,如何实现对象映射?

    (我虽然在这附近见过这样的东西,但记不清了,我的搜索创造力已经过时了。)

    4 回复  |  直到 14 年前
        1
  •  2
  •   salathe    14 年前

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

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

        3
  •  2
  •   Mike C    14 年前

    serialize($obj) 作为关键。重新创建对象调用 unserialize

        4
  •  1
  •   mario    14 年前

    仍然没有找到原稿,但记住了真正的诀窍,所以我重新实现了它:
    (昨天我的网络连接断了,给了我时间)

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

    $x = new FancyArray();
    
    $x[array(1,2,3,4)] = $something_else;   // arrays as key
    
    print $x[new SplFileInfo("x")];    // well, if set beforehand