人間が読める形式でマルチレベル配列を(ログに)出力する方法は?


91

私はdrupalサイトで作業しており、デバッグするときは常に、ネストされた長い配列を読み取る必要があります。その結果、私の人生の大部分は、矢印キー、Returnキー、およびTabキーを使用して、1000以上の文字列をネストされた読み取り可能な形式に分割することに費やされています。

drupal開発者の場合、マルチステップの#ahah /#ajaxフォームを使用しているため、develのdsm()を使用できません。また、配列をエラーログに出力するだけで、画面には出力できません。

視覚的な例:

悪の:

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' => ''、)、
...

良い:

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

編集:申し訳ありませんが、「画面に出力しない」という意味で、drupalのシステムメッセージを介して、クリック可能なネストされた形式(devel.moduleを使用)で配列を出力することができます。


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

回答:


203

エラーをApacheエラーログに記録する必要がある場合は、これを試すことができます:

error_log( print_r($multidimensionalarray, TRUE) );

3
print_r(小文字)のように見えます。print_R本当にとしても動作しますか?
evanrmurphy

ありがとう@AkhilrajNS挿入されたクエリ、またはこのログメッセージの上で実行されるクエリを送信する方法について詳しく教えてもらえますか?
ankit suthar 2017年

@ankitsuthar SQLクエリですか?
Akhilraj NS 2017

はいしかし、CIの最後のクエリ機能で取得しました。実際に、挿入、編集、削除されたデータをログに記録したいのですが。
ankit suthar 2017

これはダムです。これ\nにより、実際の改行ではなくリテラルとして改行文字が出力されます。
Otheus 2018年

23

http://php.net/manual/en/function.print-r.php この関数は、出力のフォーマットに使用できます。

$output = print_r($array,1);

$output文字列変数です。他のすべての文字列と同様にログに記録できます。純粋なphpでは使用できますtrigger_error

trigger_error($output);

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

htmlでもフォーマットする必要がある場合は、<pre>タグを使用できます


1
質問を読んでください-画面出力ではなく、OPはログ出力のためにこれを行う必要があります。
マット

@Mattは答え、読みif you need to format it also in html
コードjaff

@Fivell、やってみます。出力をログファイルに送信できることを説明するために回答を明確にした場合、-1を削除します。
マット

1
@Fivell trigger_errorメッセージに最大長1024または同様の制限があるという小さな問題があります。いくつかの長い文字列を作るとvar_exports/ print_r文字列が途切れる。単純な構造に役立ちます。
Mihai Stancu 2012

7

シンプルなもの:

を使用print_rするvar_dumpvar_export、HTMLモードではなくソース表示モードで結果を表示する場合、または@Joel Larsonがすべてを<pre>タグでラップする場合に言ったように、うまく表示する必要があります。

print_r 読みやすくするために最適ですが、null / false値を出力しません。

var_dump 値のタイプと長さ、およびnull / false値のチェックに最適です。

var_exportに似てvar_dumpいますが、ダンプされた文字列を取得するために使用できます。

これらのいずれかによって返される形式は、ソースコードで正しくインデントされておりvar_export、ダンプされた文字列を返すために使用できるため、ロギングに使用できます。

高度なもの:

PHPのxdebugプラグインを使用して、var_dumpsをrawダンプ形式ではなくHTML形式の文字列として出力し、フォーマットに使用するカスタム関数を指定することもできます。


2
答えを読んで、var_export文字列を返すことができます。
Mihai Stancu 2012

2

DrupalのDevelモジュールには、フォーマットされた配列やオブジェクトをログファイルに出力できる機能など、他の便利な機能があります。http://ratatosk.net/drupal/tutorials/debugging-drupal.htmlにあるガイドを参照してください

dd()

サイトの一時ディレクトリにある「drupal_debug.txt」という名前のファイルに変数を記録します。この関数からのすべての出力はログファイルに追加されるため、コードを変更したときに変数の内容がどのように変化するかを簡単に確認できます。

Mac OS Xを使用している場合は、ロギングコンソールを使用してログファイルの内容を監視できます。

Linuxのフレーバーを使用している場合は、コマンド「tail -f drupal_debug.txt」を使用して、ファイルに記録されているデータを監視できます。


1

これはあなたを助けます

echo '<pre>';

$output = print_r($array,1);

echo '</pre>';

編集

使用してはecho '<pre>';役に立たないですが、var_export($var);あなたが期待していることを行います。


1
@MattこのパラメーターをTRUEに設定すると、print_r()は情報を印刷するのではなく返します。
code-jaff 2012

0

preタグ内でvar_dump()を使用できるはずです。それ以外の場合は、dump_r.phpなどのライブラリの使用を検討することができます:https : //github.com/leeoniya/dump_r.php

私の解決策は間違っています。OPは、ログファイルに保存するスペースでフォーマットされたソリューションを探していました。

解決策は、var_dumpで出力バッファリングを使用し、次にすべてのタブをスペースでstr_replace()して、ログファイルでフォーマットすることです。


質問を読んでください-画面出力ではなく、OPはログ出力のためにこれを行う必要があります。
マット

私は質問を読みました。最後の小さなコメントを逃した。知らせてくれてありがとうございます。このソリューションは機能しません。
Joel Larson

0

なぜ配列をデバッグしたい方法を誰も使用または推奨しないのはなぜですか?

error_log(json_encode($array));

ブラウザの横tailにあるコンソールにコンソールログを記録します。

tail -f /var/log/apache2/error.log
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.