Intereting Posts
Вход / выход одного веб-сайта влияет на другой веб-сайт на том же сервере Как преобразовать строку, которая выглядит как шестнадцатеричный номер, в фактический шестнадцатеричный номер в php? Как отключить ручной ввод для поля JQuery UI Datepicker? Почему я получаю ошибку: неопределенная переменная? Как переименовать имя файла после загрузки с помощью php? PHP добавить / изменить параметр строки запроса и получить URL-адрес Создание / редактирование динамической страницы php PHP – нужно удалить повторяющиеся символы в строке, но хотелось бы включить исключения Расширение PHP PDO не работает в IIS Параллельная загрузка файла AJAX LIMIT Удалите настраиваемое расширение Magento с его базой данных Могут ли скрипты PHP продолжать работать, даже если пользователь закрыл браузер? Как сохранить параметры GET при отправке формы в себя? Каковы параметры «$ ns» и «$ is_prefix»? Вызов PHP-файла с использованием AJAX

Сложный тип как индекс массива

$ 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