Bagaimana cara mengeluarkan (ke log) array multi-level dalam format yang dapat dibaca manusia?

94

Saya sedang mengerjakan situs drupal dan saat melakukan debug, saya selalu harus membaca array bersarang yang panjang. Akibatnya, sebagian besar hidup saya dihabiskan dengan menggunakan tombol panah, kembali, dan tab, untuk membagi 1000+ string karakter menjadi format bersarang dan dapat dibaca.

Untuk drupal devs, saya tidak dapat menggunakan devel's dsm (), karena saya bekerja dengan formulir multi-langkah # ahah / # ajax, dan saya hanya dapat menampilkan array ke log kesalahan, bukan ke layar.

Contoh visual:

Jahat:

larik ('form_wrapper' => larik ('#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' => '', 'lulus' => '',),
...

Baik:

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', 
        ), 

Edit : Maaf, dengan "bukan keluaran ke layar", maksud saya melalui pesan sistem drupal di mana dimungkinkan untuk mengeluarkan array dalam format yang dapat diklik dan bersarang (menggunakan devel.module).

Mark Shiraldi
sumber
1
<? php echo '<pre>' .print_r ($ larik, 1). '</pre>'; ?>
Rufinus

Jawaban:

210

Jika Anda perlu memasukkan kesalahan ke log kesalahan Apache, Anda dapat mencoba ini:

error_log( print_r($multidimensionalarray, TRUE) );
Akhilraj NS
sumber
3
Sepertinya itu print_r(huruf kecil). Apakah print_Rbenar-benar berfungsi dengan baik?
evanrmurphy
terima kasih @AkhilrajNS dapatkah Anda memberi tahu saya lebih banyak tentang bagaimana saya dapat mengirim kueri yang disisipkan atau kueri apa pun yang dijalankan di atas pesan log ini.?
ankit suthar
@ankitsuthar Apakah yang Anda maksud SQL Query?
Akhilraj NS
Ya Tapi saya mendapatkannya dengan fungsi kueri terakhir di CI. Sebenarnya, saya ingin mencatat data yang disisipkan atau diedit, dihapus.
ankit suthar
Ini bodoh. Ini mengeluarkan karakter baris baru sebagai literal, \nbukan baris baru yang sebenarnya.
Otheus
22

http://php.net/manual/en/function.print-r.php Fungsi ini dapat digunakan untuk memformat keluaran,

$output = print_r($array,1);

$outputadalah variabel string, dapat dicatat seperti setiap string lainnya. Dalam php murni yang dapat Anda gunakantrigger_error

Ex. trigger_error($output);

http://php.net/manual/en/function.trigger-error.php

jika Anda perlu memformatnya juga dalam html, Anda dapat menggunakan <pre>tag

Fivell
sumber
1
Baca pertanyaannya - OP perlu melakukan ini untuk keluaran log - bukan keluaran layar.
Matt
@Matt membaca jawabannya,if you need to format it also in html
code-jaff
@ Fivell, saya coba. Jika Anda memperjelas jawaban Anda untuk menjelaskan bahwa output dapat dikirim ke file log, saya akan menghapus -1 saya.
Matt
1
@Fivell Ada masalah kecil dengan trigger_errormembatasi pesan hingga maksimal 1024 panjang atau yang serupa. Membuat beberapa lagi var_exports/ print_rstring terputus. Ini berguna untuk struktur sederhana.
Mihai Stancu
7

Hal-hal sederhana:

Menggunakan print_r, var_dumpatau var_exportharus melakukannya dengan cukup baik jika Anda melihat hasil dalam mode sumber tampilan bukan dalam mode HTML atau seperti yang dikatakan @Joel Larson jika Anda membungkus semuanya dalam <pre>tag.

print_r paling baik untuk keterbacaan tetapi tidak mencetak nilai null / false.

var_dump paling baik untuk memeriksa jenis nilai dan panjang serta nilai null / false.

var_exportmirip dengan var_dumptetapi dapat digunakan untuk mendapatkan string yang dibuang.

Format yang dikembalikan oleh salah satu dari ini diindentasi dengan benar dalam kode sumber dan var_exportdapat digunakan untuk pencatatan karena dapat digunakan untuk mengembalikan string yang dibuang.

Barang lanjutan:

Gunakan plugin xdebug untuk PHP yang akan dicetak var_dumpsebagai string berformat HTML bukan sebagai format dump mentah dan juga memungkinkan Anda menyediakan fungsi kustom yang ingin Anda gunakan untuk pemformatan.

Mihai Stancu
sumber
2
Membaca jawabannya var_exportmemungkinkan Anda untuk mengembalikan string.
Mihai Stancu
2

Modul Devel Drupal memiliki fungsi berguna lainnya termasuk yang dapat mencetak array dan objek yang diformat ke file log. Lihat panduannya di http://ratatosk.net/drupal/tutorials/debugging-drupal.html

DD()

Membuat log variabel apa pun ke file bernama "drupal_debug.txt" di direktori temp situs. Semua keluaran dari fungsi ini ditambahkan ke file log, membuatnya mudah untuk melihat bagaimana konten variabel berubah saat Anda memodifikasi kode Anda.

Jika Anda menggunakan Mac OS X, Anda dapat menggunakan Logging Console untuk memantau konten file log.

Jika Anda menggunakan Linux, Anda dapat menggunakan perintah "tail -f drupal_debug.txt" untuk melihat data sedang dicatat ke file.

nmc
sumber
1

Ini akan membantumu

echo '<pre>';

$output = print_r($array,1);

echo '</pre>';

EDIT

menggunakan echo '<pre>';tidak berguna, tetapi var_export($var);akan melakukan hal yang Anda harapkan.

kode-jaff
sumber
1
@Matt Jika parameter ini disetel ke TRUE, print_r () akan mengembalikan informasi daripada mencetaknya.
code-jaff
0

Anda harus bisa menggunakan var_dump () di dalam tag pra. Jika tidak, Anda dapat menggunakan perpustakaan seperti dump_r.php: https://github.com/leeoniya/dump_r.php

Solusi saya salah. OP sedang mencari solusi yang diformat dengan spasi untuk disimpan dalam file log.

Solusinya mungkin menggunakan buffering keluaran dengan var_dump, lalu str_replace () semua tab dengan spasi untuk memformatnya dalam file log.

Joel Larson
sumber
Baca pertanyaannya - OP perlu melakukan ini untuk keluaran log - bukan keluaran layar.
Matt
Saya membaca pertanyaan itu. Merindukan komentar kecil terakhir itu. Terima kasih telah memberi tahu saya. Solusi ini tidak akan berhasil.
Joel Larson
0

Saya hanya bertanya-tanya mengapa tidak ada yang menggunakan atau merekomendasikan cara saya lebih suka men-debug array:

error_log(json_encode($array));

Di sebelah browser saya, tailsaya log server saya di konsol misalnya.

tail -f /var/log/apache2/error.log
wittich
sumber