Я пытаюсь реализовать свою собственную функцию сериализации /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 возвращает true для разных массивов, которые содержат одни и те же элементы, и сравнение круговых массивов вызывает фатальную ошибку. В любом случае.
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 (почему?).
EDIT:
Вызов print_r, var_dump или сериализация в каждом массиве, а затем использование какого-либо механизма для обнаружения присутствия рекурсии, обнаруженного этими методами, является кошмаром с алгоритмической сложностью и в основном сделает использование слишком медленным, чтобы быть практичным на больших вложенных массивах.
ПРИНЯТЫЙ ОТВЕТ:
Я принял ответ ниже, который первым предложил временно изменить массив, чтобы убедиться, что он действительно тот же, что и другой массив. Это отвечает на вопрос "как сравнить два массива для идентификации?" из которого обнаружение рекурсии тривиально.