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