$ array [(object) $ obj] = $ other_obj;
Массивы PHP работают только с индексами, имеющими такие скалярные типы данных, как int, string, float, boolean, null. Я не могу использовать объекты в качестве индекса массива, как на других языках? Итак, как я могу достичь сопоставления объектов -> объектов?
(Хотя я видел что-то подобное здесь, но не помню точно, и мое поисковое творчество изнурено).
Похоже, вы хотите вновь SplObjectStorage
класс SplObjectStorage
, который может предоставить карту от объектов к другим данным (в вашем случае, к другим объектам).
Он реализует интерфейс ArrayAccess, чтобы вы могли использовать свой желаемый синтаксис, например $store[$obj_a] = $obj_b
.
Если вам нужно воссоздать объект из ключа, вы можете использовать serialize($obj)
в качестве ключа. Для воссоздания вызова объекта unserialize
.
Все еще не нашел оригинала, но вспомнил о трюке, поэтому я повторил его:
(вчера мое подключение к интернету дало мне время)
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); } }
с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); } }
с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