วิธีการส่งออก (ไปยังบันทึก) อาร์เรย์หลายระดับในรูปแบบที่มนุษย์อ่านได้?


94

ฉันกำลังทำงานกับไซต์ drupal และเมื่อทำการดีบักฉันมักจะต้องอ่านอาร์เรย์ที่ซ้อนกันยาว ด้วยเหตุนี้ชีวิตส่วนใหญ่ของฉันจึงหมดไปกับการใช้ลูกศรปุ่มย้อนกลับและปุ่มแท็บเพื่อแยกสตริงอักขระมากกว่า 1,000 ตัวออกเป็นรูปแบบที่ซ้อนกันและอ่านได้

สำหรับนักพัฒนา drupal ฉันไม่สามารถใช้ dsm () ของ devel ได้เนื่องจากฉันกำลังทำงานกับแบบฟอร์ม # ahah / # ajax แบบหลายขั้นตอนและฉันสามารถส่งออกอาร์เรย์ไปยังบันทึกข้อผิดพลาดเท่านั้นไม่ใช่ที่หน้าจอ

ตัวอย่างภาพ:

ความชั่วร้าย:

อาร์เรย์ ('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

คำตอบ:


210

หากคุณต้องการบันทึกข้อผิดพลาดลงในบันทึกข้อผิดพลาด Apache คุณสามารถลองสิ่งนี้:

error_log( print_r($multidimensionalarray, TRUE) );

3
ดูเหมือนว่าเป็นprint_r(ตัวพิมพ์เล็ก) ใช้print_Rงานได้จริงหรือไม่?
evanrmurphy

ขอบคุณ @AkhilrajNS คุณสามารถบอกฉันเพิ่มเติมเกี่ยวกับฉันจะส่งแบบสอบถามที่แทรกหรือคำถามใด ๆ ที่ดำเนินการเหนือข้อความบันทึกนี้ได้อย่างไร
ankit suthar

@ankitsuthar คุณหมายถึง SQL Query หรือเปล่า?
Akhilraj NS

ใช่ แต่ฉันได้รับมันจากฟังก์ชันแบบสอบถามสุดท้ายใน CI อันที่จริงฉันต้องการบันทึกข้อมูลที่ถูกแทรกหรือแก้ไขลบ
ankit suthar

นี่คือดัม สิ่งนี้จะแสดงผลอักขระขึ้นบรรทัดใหม่เป็นตัวอักษร\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
code-jaff

@Fivell ฉันพยายาม หากคุณชี้แจงคำตอบของคุณเพื่ออธิบายว่าผลลัพธ์สามารถส่งไปยังไฟล์บันทึกได้ฉันจะลบ -1 ของฉัน
Matt

1
@Fivell มีปัญหาเล็กน้อยคือtrigger_errorจำกัด ข้อความให้มีความยาวไม่เกิน 1024 หรืออะไรที่คล้ายกัน การทำให้สตริงที่ยาวขึ้นvar_exports/ print_rสตริงถูกตัดออก มีประโยชน์สำหรับโครงสร้างที่เรียบง่าย
Mihai Stancu

7

สิ่งง่ายๆ:

การใช้print_r, var_dumpหรือvar_exportควรจะทำมันสวยอย่างถ้าคุณมองไปที่ผลในโหมดดูแหล่งที่มาไม่ได้อยู่ในโหมด HTML หรือเป็น @Joel Larson กล่าวว่าถ้าคุณตัดทุกอย่างใน<pre>แท็ก

print_r ดีที่สุดสำหรับความสามารถในการอ่าน แต่จะไม่พิมพ์ค่า null / false

var_dump เหมาะที่สุดสำหรับการตรวจสอบประเภทของค่าและความยาวและค่า null / false

var_exportมีความคล้ายคลึงกันvar_dumpแต่สามารถใช้เพื่อรับสตริงที่ถูกทิ้ง

รูปแบบที่ส่งคืนโดยสิ่งเหล่านี้จะถูกเยื้องอย่างถูกต้องในซอร์สโค้ดและvar_exportสามารถใช้สำหรับการบันทึกเนื่องจากสามารถใช้เพื่อส่งคืนสตริงที่ถูกทิ้ง

ขั้นสูง:

ใช้ปลั๊กอิน xdebug สำหรับ PHP ซึ่งพิมพ์var_dumps เป็นสตริงที่จัดรูปแบบ HTML ไม่ใช่รูปแบบการถ่ายโอนข้อมูลดิบและยังช่วยให้คุณสามารถจัดหาฟังก์ชันแบบกำหนดเองที่คุณต้องการใช้สำหรับการจัดรูปแบบ


2
อ่านคำตอบvar_exportช่วยให้คุณส่งคืนสตริง
Mihai Stancu

2

โมดูล Develของ Drupal มีฟังก์ชันที่มีประโยชน์อื่น ๆ รวมถึงฟังก์ชันที่สามารถพิมพ์อาร์เรย์และวัตถุที่จัดรูปแบบไปยังไฟล์บันทึก ดูคู่มือได้ที่http://ratatosk.net/drupal/tutorials/debugging-drupal.html

dd ()

บันทึกตัวแปรลงในไฟล์ชื่อ“ drupal_debug.txt” ในไดเร็กทอรี temp ของไซต์ เอาต์พุตทั้งหมดจากฟังก์ชันนี้จะต่อท้ายไฟล์บันทึกทำให้ง่ายต่อการดูว่าเนื้อหาของตัวแปรเปลี่ยนแปลงอย่างไรเมื่อคุณแก้ไขโค้ดของคุณ

หากคุณใช้ Mac OS X คุณสามารถใช้ Logging Console เพื่อตรวจสอบเนื้อหาของไฟล์บันทึก

หากคุณใช้ 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

คุณควรใช้ 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

0

ไวยากรณ์

print_r(variable, return);

ตัวแปรที่ จำเป็นที่จำเป็นระบุตัวแปรที่จะส่งคืนข้อมูลเกี่ยวกับ

กลับ ไม่จำเป็น เมื่อตั้งค่าเป็นจริงฟังก์ชันนี้จะส่งคืนข้อมูล (ไม่พิมพ์ออกมา) ค่าเริ่มต้นเป็นเท็จ

ตัวอย่าง

error_log( print_r(<array Variable>, TRUE) );
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.