以可读/分层格式显示数组


95

这是为我的数组提取数据的代码

<?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

Answers:


31

试试这个:

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

代替 print_r($data)


1
<?php foreach($data[0] as $child) { echo $child . "<br />"; }?> 非常感谢Brian!
Xavier

55
为什么<pre> </ pre>是显而易见的选择,这到底是为什么呢?
cantsay 2014年

1
如果您具有多维数组,则将无法使用。
Alesana

3
@Alesana是的,但是OP没有多维数组。我认为,正如其他人对这个答案的评论一样,您想要的方式是<pre>print_r($data)</pre>。看到一个5岁以上的答案有新评论总是很有趣!:)
Brian Driscoll

2
嗯,就我而言,我正在使用多维数组。我之前没有发表评论,所以当我看到别人都没有指出这一点时,我认为这可能是一个绝好的机会!
Alesana

423

代替

print_r($data);

尝试

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

3
还值得一提的是,您可以将true第二个参数传递给print_r以获取数据string。现在,您可以return '<pre>'.print_r(User::all(), true);从您的路线文件。
DutGRIFF 2014年

我也喜欢这个答案,但是OP只希望打印Strings,而不希望数组索引(看起来像)。而且只有一维数据。通常,在执行解决方案之前,我通常只会执行此操作以检查数据记录集,因此该解决方案对于类似这样的事情更有效。
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优化功能

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

7
到目前为止最好的答案,如果经常使用逗号,甚至可以对其进行更多优化:echo '<pre>',print_r($a,1),'</pre>';
Darkendorf 2014年

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的格式是“在您网页的源代码中”->尝试菜单“查看源代码”,或者在Firefox中按Ctrl-U
fpierrat

@fpierrat是的,这正是我的意思。感谢您澄清这一点。
Hexodus 2015年

1
这种方法的一个好处是输出被格式化为有效的PHP,因此您可以根据需要将其复制/粘贴回代码中。
肖恩·比恩

13

如果有人需要查看数组很酷;)使用此方法..这将打印到您的浏览器控制台

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

你可以这样使用

console($myObject);

输出将是这样..太酷了!

在此处输入图片说明


4
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 as $ v)echo $ v,PHP_EOL; ?>显示“ Array”
Xavier

1
好的,那么您应该迭代两次foreach($ raw as $ array)foreach($ array as $ v)echo $ v,PHP_EOL;
Yaronius 2011年

3

print_r()主要用于调试。如果要以这种格式打印,请遍历数组,然后打印出元素。

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

感谢您的答复,但它将数据打印为“数组”
Xavier

@Xavier:您是否在我的答案中尝试了更新的代码?您需要遍历两个数组。 $data是一个数组数组。
火箭Hazmat

而且您的代码也运行得很好,我只是将/ n更改为<br />
Xavier

3

这可能是一个更简单的解决方案:

echo implode('<br>', $data[0]);

2

我假设有人使用print_r进行调试。然后,我建议使用像Kint这样的库。这允许以可读格式显示大数组:

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

在此处输入图片说明


1
这不是普通的PHP解决方案,但绝对可以提供有用且可读的输出!
肖恩·比恩

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

使用var_dump函数在php中打印格式化数组的一种非常好的方法。

 $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

一线实现快速便捷的JSON表示形式:

    echo json_encode($data, JSON_PRETTY_PRINT);

如果已经将composer用于该项目,则需要symfony / yaml并:

    echo Yaml::dump($data);

0
echo '<pre>';
foreach($data as $entry){
    foreach($entry as $entry2){
        echo $entry2.'<br />';
    }
}

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] => ''
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.