แสดงอาร์เรย์ในรูปแบบที่อ่านได้ / ลำดับชั้น


96

นี่คือรหัสสำหรับดึงข้อมูลสำหรับอาร์เรย์ของฉัน

<?php
    $link = mysqli_connect('localhost', 'root', '', 'mutli_page_form');

    $query = "SELECT * FROM wills_children WHERE will=73";

    $result = mysqli_query($link, $query) or die(mysqli_error($link));

    if ($result = mysqli_query($link, $query)) {

    /* fetch associative array */
    if($row = mysqli_fetch_assoc($result)) {
        $data = unserialize($row['children']);
    }

    /* free result set */
    mysqli_free_result($result);
    }
?>

เมื่อฉันใช้ print_r ($ data) มันอ่านว่า:

Array ( [0] => Array ( [0] => Natural Chlid 1 [1] => Natural Chlid 2 [2] => Natural Chlid 3 ) ) 

ฉันต้องการให้อ่านเป็น:

เด็กธรรมชาติ 1
เด็ก
ธรรมชาติ2 เด็กธรรมชาติ 3

คำตอบ:


31

ลองสิ่งนี้:

foreach($data[0] as $child) {
   echo $child . "\n";
}

แทนที่ print_r($data)


1
<?php foreach($data[0] as $child) { echo $child . "<br />"; }?> มันใช้งานได้ดีมากขอบคุณ Brian!
Xavier

58
ทำไมจึงเป็นคำตอบที่เลือกบนโลกนี้ในเมื่อ <pre> </pre> เป็นตัวเลือกที่ชัดเจน
cantsay

1
สิ่งนี้จะใช้ไม่ได้หากคุณมีอาร์เรย์หลายมิติ
scorgn

3
@Alesana ใช่ แต่ OP ไม่มีอาร์เรย์หลายมิติ <pre>print_r($data)</pre>ผมคิดว่าเป็นคนอื่นได้แสดงความคิดเห็นในคำตอบนี้ในแบบที่คุณต้องการที่จะไปเป็น สนุกเสมอที่จะเห็นความคิดเห็นใหม่เกี่ยวกับคำตอบที่มีอายุ 5 ปีขึ้นไป :)
Brian Driscoll

2
อ่าในกรณีของฉันฉันกำลังทำงานกับอาร์เรย์หลายมิติ ฉันไม่ได้แสดงความคิดเห็นมาก่อนดังนั้นเมื่อฉันเห็นว่าไม่มีใครชี้ให้เห็นฉันคิดว่ามันอาจจะเป็นโอกาสที่ดี!
scorgn

430

แทน

print_r($data);

ลอง

print "<pre>";
print_r($data);
print "</pre>";

3
นอกจากนี้ยังเป็นมูลค่าการกล่าวขวัญว่าคุณสามารถส่งผ่านtrueเป็นพารามิเตอร์ที่สองเพื่อ print_r stringที่จะได้รับข้อมูลเป็น ตอนนี้คุณสามารถทำได้return '<pre>'.print_r(User::all(), true);จากไฟล์เส้นทางของคุณ
DutGRIFF

ฉันชอบคำตอบนี้เช่นกัน แต่ OP ต้องการให้ Strings พิมพ์เท่านั้นไม่ใช่ดัชนีอาร์เรย์ (ดูเหมือนว่า) และข้อมูล 1 มิติเท่านั้น โดยปกติฉันจะทำเพียงเพื่อตรวจสอบชุดบันทึกข้อมูลก่อนที่จะดำเนินการแก้ไขต่อไปดังนั้นโซลูชันนี้จึงทำงานได้ดีกว่าสำหรับสิ่งต่างๆ
iopener


47

ฉันมีฟังก์ชั่นพื้นฐาน:

function prettyPrint($a) {
    echo "<pre>";
    print_r($a);
    echo "</pre>";
}

prettyPrint($data);

แก้ไข:ฟังก์ชันที่ปรับให้เหมาะสม

function prettyPrint($a) {
    echo '<pre>'.print_r($a,1).'</pre>';
}

แก้ไข:ฟังก์ชัน Moar Optimized พร้อมการรองรับแท็กที่กำหนดเอง

function prettyPrint($a, $t='pre') {echo "<$t>".print_r($a,1)."</$t>";}

7
คำตอบที่ดีที่สุดจนถึงตอนนี้และคุณสามารถปรับให้เหมาะสมได้มากขึ้นหากใช้บ่อยมากด้วยลูกน้ำ:echo '<pre>',print_r($a,1),'</pre>';
Darkendorf

15

ฉันคิดว่าvar_export()พี่ชายที่ถูกลืมvar_dump()มีผลลัพธ์ที่ดีที่สุด - กะทัดรัดกว่า:

echo "<pre>";
var_export($menue);
echo "</pre>";

โดยวิธีการ: ไม่จำเป็นต้องใช้<pre>ทั้งหมด var_dump()และvar_export()ได้รับการจัดรูปแบบแล้วเมื่อคุณดูในซอร์สโค้ดของหน้าเว็บของคุณ


ฉันเห็นด้วยเกี่ยวกับ var_export แต่ฉันต้องรวมเข้ากับ <pre> </pre> เนื่องจากไม่ได้แสดงผลลัพธ์ในรูปแบบที่เหมาะสม
Chaya Cooper

3
@ Chaya-Cooper มันไม่ได้จัดรูปแบบอย่างถูกต้องในหน้าที่แสดง แต่ฉันคิดว่า Hexodus หมายถึงมันถูกจัดรูปแบบ "ในซอร์สโค้ดของหน้าเว็บของคุณ" -> ลองเมนู "ดูแหล่งที่มา" หรือ Ctrl-U ใน Firefox
fpierrat

@fpierrat ใช่นี่คือสิ่งที่ฉันหมายถึง ขอบคุณที่ชี้แจง
Hexodus

1
ข้อดีอย่างหนึ่งของวิธีนี้คือเอาต์พุตถูกจัดรูปแบบเป็น PHP ที่ถูกต้องดังนั้นคุณสามารถคัดลอก / วางกลับลงในโค้ดของคุณได้ทันทีหากต้องการ
Sean the Bean

14

ถ้ามีคนต้องการดูอาร์เรย์ให้เจ๋ง ๆ ;) ใช้วิธีนี้ .. ซึ่งจะพิมพ์ไปยังคอนโซลเบราว์เซอร์ของคุณ

function console($obj)
{
    $js = json_encode($obj);
    print_r('<script>console.log('.$js.')</script>');
}

ใช้แบบนี้ก็ได้ ..

console($myObject);

เอาท์พุตจะเป็นแบบนี้.. เท่จัง !!

ป้อนคำอธิบายภาพที่นี่


5
foreach($array as $v) echo $v, PHP_EOL;

อัปเดต : โซลูชันที่ซับซ้อนยิ่งขึ้นคือ:

 $test = [
    'key1' => 'val1',
    'key2' => 'val2',
    'key3' => [
        'subkey1' => 'subval1',
        'subkey2' => 'subval2',
        'subkey3' => [
            'subsubkey1' => 'subsubval1',
            'subsubkey2' => 'subsubval2',
        ],
    ],
];
function printArray($arr, $pad = 0, $padStr = "\t") {
    $outerPad = $pad;
    $innerPad = $pad + 1;
    $out = '[' . PHP_EOL;
    foreach ($arr as $k => $v) {
        if (is_array($v)) {
            $out .= str_repeat($padStr, $innerPad) . $k . ' => ' . printArray($v, $innerPad) . PHP_EOL;
        } else {
            $out .= str_repeat($padStr, $innerPad) . $k . ' => ' . $v;
            $out .= PHP_EOL;
        }
    }
    $out .= str_repeat($padStr, $outerPad) . ']';
    return $out;
}

echo printArray($test);

สิ่งนี้พิมพ์ออกมา:

    [
        key1 => val1
        key2 => val2
        key3 => [
            subkey1 => subval1
            subkey2 => subval2
            subkey3 => [
                subsubkey1 => subsubval1
                subsubkey2 => subsubval2
            ]
        ]
    ]

<? php foreach ($ data เป็น $ v) echo $ v, PHP_EOL; ?> แสดง "Array"
Xavier

1
เอาล่ะคุณควรทำซ้ำสองครั้ง foreach ($ raw เป็น $ array) foreach ($ array เป็น $ v) echo $ v, PHP_EOL;
Yaronius

3

print_r()เป็นส่วนใหญ่สำหรับการดีบัก หากคุณต้องการพิมพ์ในรูปแบบดังกล่าวให้วนรอบอาร์เรย์และพิมพ์องค์ประกอบออกมา

foreach($data as $d){
  foreach($d as $v){
    echo $v."\n";
  }
}

ขอบคุณสำหรับการตอบกลับ แต่พิมพ์ข้อมูลออกมาเป็น "Array"
Xavier

@ ซาเวียร์: คุณลองใช้รหัสที่ปรับปรุงแล้วในคำตอบของฉันหรือไม่? คุณต้องวนซ้ำทั้งสองอาร์เรย์ $dataคืออาร์เรย์ของอาร์เรย์
Rocket Hazmat

และรหัสของคุณก็ทำงานได้อย่างสมบูรณ์เช่นกันฉันเพิ่งเปลี่ยน / n เป็น <br />
Xavier


2

ฉันถือว่าหนึ่งใช้ print_r สำหรับการดีบัก ฉันก็จะแนะนำให้ใช้ห้องสมุดเช่นKint สิ่งนี้ช่วยให้แสดงอาร์เรย์ขนาดใหญ่ในรูปแบบที่อ่านได้:

$data = [['Natural Child 1', 'Natural Child 2', 'Natural Child 3']];
Kint::dump($data, $_SERVER);

ป้อนคำอธิบายภาพที่นี่


1
นี่ไม่ใช่โซลูชัน PHP ของวานิลลา แต่ให้ผลลัพธ์ที่มีประโยชน์และอ่านได้แน่นอน!
Sean the Bean

1
<?php 
//Make an array readable as string
function array_read($array, $seperator = ', ', $ending = ' and '){
      $opt = count($array);
      return $opt > 1 ? implode($seperator,array_slice($array,0,$opt-1)).$ending.end($array) : $array[0];
}
?>

ฉันใช้สิ่งนี้เพื่อแสดงอาร์เรย์ที่พิมพ์ออกมาให้กับผู้เยี่ยมชมของฉัน


1

วิธีที่ดีมากในการพิมพ์อาร์เรย์ที่จัดรูปแบบใน php โดยใช้ฟังก์ชัน var_dump

 $a = array(1, 2, array("a", "b", "c"));
 var_dump($a);

1

ฉันใช้สิ่งนี้เพื่อรับคีย์และค่า $ qw = mysqli_query ($ connection, $ query);

while ( $ou = mysqli_fetch_array($qw) )
{
    foreach ($ou as $key => $value) 
    {
            echo $key." - ".$value."";
    }
    echo "<br/>";
}

1

ฉันจะใช้เครื่องมือออนไลน์


ฉันเพิ่งอัปเดตสิ่งนี้ให้มีประสิทธิภาพมากขึ้นขอบคุณสำหรับลิงค์
phillihp

1

ซับเดียวสำหรับการนำเสนอ JSON ที่รวดเร็วและง่ายดาย:

    echo json_encode($data, JSON_PRETTY_PRINT);

หากใช้นักแต่งเพลงสำหรับโปรเจ็กต์อยู่แล้วต้องใช้ symfony / yaml และ:

    echo Yaml::dump($data);


0

สำหรับอาร์เรย์เดี่ยวที่คุณสามารถใช้การระเบิดได้จะมีผลลัพธ์ที่สะอาดกว่าในการพิมพ์

<?php
$msg = array('msg1','msg2','msg3');
echo implode('<br />',$msg);
echo '<br />----------------------<br/>';

echo nl2br(implode("\n",$msg));
echo '<br />----------------------<br/>';
?>

สำหรับอาร์เรย์หลายมิติคุณต้องรวมกับลูปบางประเภท

<?php
$msgs[] = $msg;
$msgs[] = $msg;
$msgs[] = $msg;
$msgs[] = $msg;
$msgs[] = $msg;
foreach($msgs as $msg) {
    echo implode('<br />',$msg);
    echo '<br />----------------------<br/>';
}
?>

0

สิ่งนี้พยายามปรับปรุงprint_r()การจัดรูปแบบเอาต์พุตในแอปพลิเคชันคอนโซล:

function pretty_printr($array) {

  $string = print_r($array, TRUE);

  foreach (preg_split("/((\r?\n)|(\r\n?))/", $string) as $line) {

    $trimmed_line = trim($line);

    // Skip useless lines.
    if (!$trimmed_line || $trimmed_line === '(' || $trimmed_line === ')' || $trimmed_line === 'Array') {
      continue;
    }

    // Improve lines ending with empty values.
    if (substr_compare($trimmed_line, '=>', -2) === 0) {
      $line .=  "''";
    }

    print $line . PHP_EOL;
  }
}

ตัวอย่าง:

[activity_score] => 0
[allow_organisation_contact] => 1
[cover_media] => Array
        [image] => Array
                [url] => ''
        [video] => Array
                [url] => ''
                [oembed_html] => ''
        [thumb] => Array
                [url] => ''
[created_at] => 2019-06-25T09:50:22+02:00
[description] => example description
[state] => published
[fundraiser_type] => anniversary
[end_date] => 2019-09-25
[event] => Array
[goal] => Array
        [cents] => 40000
        [currency] => EUR
[id] => 37798
[your_reference] => ''
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.