Есть ли способ обнаруживать круговые массивы в чистом PHP?

Я пытаюсь реализовать мою собственную функцию стиля сериализации / var_dump в PHP. Это кажется невозможным, если есть возможность круговых массивов (что есть).

В последних версиях PHP, похоже, что var_dump обнаруживает кольцевые массивы:

php > $a = array();
php > $a[] = &$a;
php > var_dump($a);
array(1) {
  [0]=>
  &array(1) {
    [0]=>
    *RECURSION*
  }
}

Как мне реализовать свой собственный метод сериализации в PHP, который может обнаруживать аналогичным образом? Я не могу просто отслеживать, какие массивы я посещал, потому что строгое сравнение массивов в PHP возвращает истину для разных массивов, содержащих одни и те же элементы, а сравнение круговых массивов в любом случае вызывает фатальную ошибку.

php > $b = array(1,2);
php > $c = array(1,2);
php > var_dump($b === $c);
bool(true)
php > $a = array();
php > $a[] = &$a;
php > var_dump($a === $a);
PHP Fatal error:  Nesting level too deep - recursive dependency? in php shell code on line 1

Я искал способ найти уникальный идентификатор (указатель) для массива, но не могу его найти. spl_object_hash работает только с объектами, а не с массивами. Если я приведу несколько разных массивов к объектам, все они получат одно и то же значение spl_object_hash (почему?).

РЕДАКТИРОВАТЬ:

Вызов print_r, var_dump или сериализации для каждого массива, а затем использование какого-либо механизма для обнаружения наличия рекурсии, обнаруженной этими методами, является кошмаром алгоритмической сложности и в основном делает любое использование слишком медленным, чтобы быть практичным на больших вложенных массивах.

ПРИНЯЛ ОТВЕТ:

Я принял ответ ниже, который первым предлагал временно изменить массив, чтобы увидеть, действительно ли он такой же, как другой массив.Это отвечает на вопрос «как сравнить два массива на предмет идентичности?» из которых обнаружение рекурсии тривиально.

19
задан postfuturist 16 February 2012 в 23:30
поделиться