Làm cách nào để xuất (ra nhật ký) một mảng nhiều cấp ở định dạng mà con người có thể đọc được?


91

Tôi đang làm việc trên một trang web drupal và khi gỡ lỗi, tôi luôn phải đọc qua các mảng dài, lồng nhau. Do đó, một phần lớn cuộc đời của tôi đã dành cho việc sử dụng các phím mũi tên, phím quay lại và phím tab, để chia hơn 1000 chuỗi ký tự thành một định dạng lồng nhau, có thể đọc được.

Đối với các nhà phát triển drupal, tôi không thể sử dụng dsm () của devel, vì tôi đang làm việc với các biểu mẫu # ahah / # ajax nhiều bước và tôi chỉ có thể xuất các mảng vào nhật ký lỗi chứ không phải ra màn hình.

Ví dụ trực quan:

Tà ác:

array ('form_wrapper' => array ('#tree' => true, '#type' => 'fieldset', '#prefix' => '', '#suffix' => '', '#value' = > '', 'name' => array ('#type' => 'textfield', '#title' => NULL, '#size' => 60, '#maxlength' => 60, '#required' = > false, '#description' => NULL, '#attributes' => array ('placeholder' => 'Email',), '#post' => array ('form_wrapper' => array ('name' => '', 'pass' => '',),
...

Tốt:

array ( 
'form_wrapper' => array ( 
    '#tree' => true, 
    '#type' => 'fieldset', 
    '#prefix' => '<div>', 
    '#suffix' => '</div>', 
    '#value' => '', 
    'name' => array ( 
        '#type' => 'textfield', 
        '#title' => NULL, 
        '#size' => 60, 
        '#maxlength' => 60, 
        '#required' => false, 
        '#description' => NULL, 
        '#attributes' => array ( 
            'placeholder' => 'Email', 
        ), 

Chỉnh sửa : Xin lỗi, bởi "không xuất ra màn hình", ý tôi là thông qua các thông báo hệ thống của drupal, nơi có thể xuất các mảng ở định dạng có thể nhấp, được lồng vào nhau (sử dụng devel.module).


1
<? php echo '<pre>' .print_r ($ array, 1). '</pre>'; ?>
Rufinus

Câu trả lời:


203

Nếu bạn cần ghi lỗi vào nhật ký lỗi Apache, bạn có thể thử cách này:

error_log( print_r($multidimensionalarray, TRUE) );

3
Hình như nó print_r(chữ thường). Có print_Rthực sự hoạt động tốt không?
evanrmurphy

cảm ơn @AkhilrajNS bạn có thể cho tôi biết thêm về cách tôi có thể gửi truy vấn đã chèn hoặc bất kỳ truy vấn nào được thực thi phía trên thông báo nhật ký này không.?
ankit suthar

@ankitsuthar Ý của bạn là Truy vấn SQL?
Akhilraj NS

Có Nhưng tôi đã hiểu nó bằng hàm truy vấn cuối cùng trong CI. Trên thực tế, tôi muốn ghi lại một dữ liệu được chèn hoặc chỉnh sửa, xóa.
ankit suthar

Đây là dum. Điều này xuất ra các ký tự dòng mới dưới dạng chữ \nthay vì các dòng mới thực tế.
Otheus

23

http://php.net/manual/en/ Chức năng.print-r.php Chức năng này có thể được sử dụng để định dạng đầu ra,

$output = print_r($array,1);

$outputlà một biến chuỗi, nó có thể được ghi như mọi chuỗi khác. Trong php thuần túy, bạn có thể sử dụngtrigger_error

Ví dụ. trigger_error($output);

http://php.net/manual/en/ Chức năng.trigger-error.php

nếu bạn cần định dạng nó cũng trong html, bạn có thể sử dụng <pre>thẻ


1
Đọc câu hỏi - OP cần làm điều này cho đầu ra nhật ký - không phải đầu ra màn hình.
Matt

@Matt đọc câu trả lời,if you need to format it also in html
code-jaff

@Fivell, tôi thử. Nếu bạn làm rõ câu trả lời của mình để giải thích rằng đầu ra có thể được gửi đến tệp nhật ký, tôi sẽ xóa -1 của tôi.
Matt

1
@Fivell có một vấn đề nhỏ là trigger_errornó giới hạn tin nhắn ở độ dài tối đa 1024 hoặc tương tự. Làm cho một số dài hơn var_exports/ print_rchuỗi bị cắt bỏ. Nó hữu ích cho các cấu trúc đơn giản.
Mihai Stancu

7

Công cụ đơn giản:

Sử dụng print_r, var_dumphoặc var_exportnên làm điều đó khá hay nếu bạn nhìn vào kết quả ở chế độ xem nguồn không phải ở chế độ HTML hoặc như @Joel Larson đã nói nếu bạn gói mọi thứ trong một <pre>thẻ.

print_r là tốt nhất để dễ đọc nhưng nó không in giá trị null / false.

var_dump là tốt nhất để kiểm tra các loại giá trị và độ dài và giá trị null / false.

var_exporttương tự như var_dumpnhưng nó có thể được sử dụng để lấy chuỗi đã kết xuất.

Định dạng được trả về bởi bất kỳ định dạng nào trong số này được thụt lề chính xác trong mã nguồn và var_exportcó thể được sử dụng để ghi nhật ký vì nó có thể được sử dụng để trả về chuỗi đã kết xuất.

Công cụ nâng cao:

Sử dụng trình cắm xdebug cho PHP, bản in này sẽ in ra var_dumpdưới dạng chuỗi được định dạng HTML không phải là định dạng kết xuất thô và cũng cho phép bạn cung cấp một hàm tùy chỉnh mà bạn muốn sử dụng để định dạng.


2
Đọc câu trả lời var_exportcho phép bạn trả về một chuỗi.
Mihai Stancu

2

Mô-đun Devel của Drupal có các chức năng hữu ích khác bao gồm các chức năng có thể in các mảng và đối tượng được định dạng để đăng nhập tệp. Xem hướng dẫn tại http://ratatosk.net/drupal/tutorials/debugging-drupal.html

dd ()

Ghi bất kỳ biến nào vào tệp có tên “drupal_debug.txt” trong thư mục tạm thời của trang web. Tất cả đầu ra từ hàm này được thêm vào tệp nhật ký, giúp bạn dễ dàng xem nội dung của một biến thay đổi như thế nào khi bạn sửa đổi mã của mình.

Nếu đang sử dụng Mac OS X, bạn có thể sử dụng Bảng điều khiển ghi nhật ký để theo dõi nội dung của tệp nhật ký.

Nếu đang sử dụng phiên bản Linux, bạn có thể sử dụng lệnh “tail -f drupal_debug.txt” để xem dữ liệu được ghi vào tệp.


1

Điều này sẽ giúp bạn

echo '<pre>';

$output = print_r($array,1);

echo '</pre>';

BIÊN TẬP

sử dụng echo '<pre>';là vô ích, nhưng var_export($var);sẽ làm điều mà bạn đang mong đợi.


1
@Matt Khi tham số này được đặt thành TRUE, print_r () sẽ trả về thông tin thay vì in ra.
code-jaff

0

Bạn sẽ có thể sử dụng var_dump () trong thẻ trước. Nếu không, bạn có thể sử dụng thư viện như dump_r.php: https://github.com/leeoniya/dump_r.php

Giải pháp của tôi là không chính xác. OP đang tìm kiếm một giải pháp được định dạng với khoảng trắng để lưu trữ trong tệp nhật ký.

Một giải pháp có thể là sử dụng bộ đệm đầu ra với var_dump, sau đó str_replace () tất cả các tab có khoảng trắng để định dạng nó trong tệp nhật ký.


Đọc câu hỏi - OP cần làm điều này cho đầu ra nhật ký - không phải đầu ra màn hình.
Matt

Tôi đã đọc câu hỏi. Bỏ lỡ rằng bình luận nhỏ cuối cùng. Cảm ơn vì đã cho tôi biết. Giải pháp này sẽ không hoạt động sau đó.
Joel Larson

0

Tôi chỉ tự hỏi tại sao không ai sử dụng hoặc đề xuất cách tôi thích gỡ lỗi một mảng:

error_log(json_encode($array));

Bên cạnh trình duyệt tailcủa tôi, tôi máy chủ của tôi đăng nhập vào bảng điều khiển, ví dụ.

tail -f /var/log/apache2/error.log
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.