사람이 읽을 수있는 형식으로 다중 레벨 배열을 (로그에) 출력하는 방법은 무엇입니까?


94

저는 drupal 사이트에서 작업 중이며 디버깅 할 때 항상 길고 중첩 된 배열을 읽어야합니다. 결과적으로 내 인생의 많은 부분을 화살표, 리턴 및 탭 키를 사용하여 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'=> '', '통과'=> '',),
...

좋은:

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

편집 : 죄송합니다. "화면으로 출력되지 않음"은 클릭 가능한 중첩 형식 (devel.module 사용)으로 배열을 출력 할 수있는 drupal의 시스템 메시지를 통해 의미했습니다.


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

답변:


210

Apache 오류 로그에 오류를 기록해야하는 경우 다음을 시도 할 수 있습니다.

error_log( print_r($multidimensionalarray, TRUE) );

3
외모는 그것의 좋아하는 print_r(소문자). print_R정말 잘 작동 합니까 ?
evanrmurphy

감사합니다 @AkhilrajNS 삽입 된 쿼리 또는이 로그 메시지 위에서 실행되는 쿼리를 보낼 수있는 방법에 대해 자세히 설명해 주시겠습니까?
ankit suthar

@ankitsuthar SQL 쿼리를 의미 했습니까?
Akhilraj NS 2005

예하지만 CI의 마지막 쿼리 기능으로 얻었습니다. 사실 삽입, 편집, 삭제 된 데이터를 로그하고 싶습니다.
ankit suthar 2010

이건 바보 야. 이것은 개행 문자 \n를 실제 개행 대신 리터럴로 출력 합니다.
Otheus

22

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을 제거하겠습니다.
Matt

1
@Fivell trigger_error메시지를 최대 1024 길이 또는 이와 유사한 것으로 제한 하는 작은 문제가 있습니다. 더 긴 var_exports/ print_r현이 잘립니다. 단순한 구조에 유용합니다.
Mihai Stancu 2012 년

7

간단한 것 :

사용 print_r, var_dump또는 var_export아주 잘 당신이하지 HTML 모드에서 또는 당신이 모든 것을 감싸는 경우 @Joel 라슨 말했듯이보기 소스 모드에서 결과를 보면 그것을해야 <pre>태그를.

print_r 가독성에 가장 좋지만 null / false 값을 인쇄하지 않습니다.

var_dump 값 및 길이 유형과 null / false 값을 확인하는 데 가장 적합합니다.

var_export에에 simmilar입니다 var_dump있지만 덤프 된 문자열을 가져올 수 있습니다.

이들 중 하나에 의해 반환 된 형식은 소스 코드에서 올바르게 들여 쓰기 var_export되며 덤프 된 문자열을 반환하는 데 사용할 수 있으므로 로깅에 사용할 수 있습니다.

고급 기능 :

PHP 용 xdebug 플러그인을 사용하면를 var_dump원시 덤프 형식이 아닌 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

0

pre 태그 내에서 var_dump ()를 사용할 수 있어야합니다. 그렇지 않으면 dump_r.php와 같은 라이브러리를 사용할 수 있습니다 : https://github.com/leeoniya/dump_r.php

내 솔루션이 잘못되었습니다. OP는 로그 파일에 저장할 공백으로 형식화 된 솔루션을 찾고있었습니다.

해결책은 var_dump와 함께 출력 버퍼링을 사용한 다음 str_replace () 공백이있는 모든 탭을 사용하여 로그 파일에서 형식을 지정하는 것입니다.


질문을 읽으십시오-OP는 화면 출력이 아닌 로그 출력을 위해 이것을 수행해야합니다.
Matt

나는 질문을 읽었다. 마지막 작은 댓글을 놓쳤습니다. 알려 줘서 고마워. 이 솔루션은 작동하지 않습니다.
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.