Tôi đang cố gắng triển khai chức năng tuần tự hóa/var_dump của riêng mình trong PHP. Có vẻ như không thể nếu có khả năng của mảng tròn (mà có).Có cách nào để phát hiện mảng tròn trong PHP thuần túy không?
Trong các phiên bản PHP gần đây, var_dump dường như phát hiện các mảng tròn:
php > $a = array();
php > $a[] = &$a;
php > var_dump($a);
array(1) {
[0]=>
&array(1) {
[0]=>
*RECURSION*
}
}
Làm thế nào tôi có thể thực hiện kiểu serialization riêng của tôi về phương pháp trong PHP có thể phát hiện tương tự? Tôi không thể theo dõi các mảng mà tôi đã truy cập, bởi vì việc so sánh chặt chẽ các mảng trong PHP trả về true cho các mảng khác nhau có chứa các phần tử giống nhau và so sánh các mảng tròn gây ra Lỗi nghiêm trọng, anyways.
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
Tôi đã tìm cách tìm id duy nhất (con trỏ) cho mảng, nhưng tôi không thể tìm thấy. spl_object_hash chỉ hoạt động trên các đối tượng, không phải mảng. Nếu tôi bỏ nhiều khác nhau mảng cho các đối tượng, tất cả chúng đều có cùng giá trị spl_object_hash (tại sao?).
EDIT:
Calling print_r, var_dump, hoặc serialize trên mỗi mảng và sau đó sử dụng một số cơ chế để phát hiện sự có mặt của đệ quy như phát hiện bởi các phương pháp đó là một phức tạp cơn ác mộng thuật toán và về cơ bản sẽ làm cho việc sử dụng quá chậm để thực tế trên các mảng lồng nhau lớn.
trả lời chấp nhận:
tôi chấp nhận câu trả lời dưới đây là người đầu tiên đề nghị tạm thời thay đổi một mảng để xem nếu nó thực sự là giống như mảng khác. Điều đó trả lời "làm thế nào để tôi so sánh hai mảng cho danh tính?" từ đó phát hiện đệ quy là tầm thường.
Câu trả lời là sẽ là: bạn không thể. Xem [check if object/array là một tham chiếu] (http://stackoverflow.com/questions/3148125/php-check-if-object-array-is-a-reference). Không có so sánh tham chiếu giống như con trỏ, vì vậy việc phát hiện một vòng lặp không thể thực hiện được. Cách giải quyết tốt hơn trong trường hợp của bạn có thể là truyền xung quanh một trong các hàm gốc ('json_decode (json_encode())') để loại bỏ các tham chiếu, và chỉ sau đó áp dụng điều kiện tuần tự hóa của riêng bạn. – mario
Bây giờ ngay cả PHPUnit đang sử dụng phương pháp "đánh dấu" tạm thời để phát hiện đệ quy mảng. – postfuturist