PHP递归打印带键的多维数组的所有元素

4
我发现了下面这段代码,可以很好地打印出数组的所有元素。如何修改它,以便先打印一个键,然后打印与该键对应的所有值,然后是另一个键,然后是与该键对应的所有值?我还想修改它,使其只打印每个键的前9个值(不超过9个)。
 function printAll($a) {
  if (!is_array($a)) {
    echo $a, ' ';
     return;
   }

   foreach($a as $v) {
   printAll($v);
  }
 }

foreach($a as $k=>$v) { printAll($k); } 遍历$a数组,将所有元素的键名$k传递给printAll()函数。 - v0d1ch
7个问题,11个答案,没有被接受的吗? - Majid Fouladpour
@ Steven Farley,它不让我再接受2分钟。 - user1605871
@user1605871 你应该对其他7个问题也这样做,你可以通过访问你的个人资料找到你过去提出的问题。 - PhearOfRayne
@ Steven Farley。好的,没问题。抱歉我之前没意识到你可以这样做。 - user1605871
@user1605871,你不需要接受每个问题的答案。只有那些真正提供了实际帮助和/或完全正确的答案才应该被接受。100%的接受率和0%的接受率一样都是一个警示信号。 - Charles
5个回答

11

我假设你想要一些非程序员也能理解的东西。

function pretty_dump($arr, $d=1){
    if ($d==1) echo "<pre>";    // HTML Only
    if (is_array($arr)){
        foreach($arr as $k=>$v){
            for ($i=0;$i<$d;$i++){
                echo "\t";
            }
            if (is_array($v)){
                echo $k.PHP_EOL;
                Pretty_Dump($v, $d+1);
            } else {
                echo $k."\t".$v.PHP_EOL;
            }
        }
    }
    if ($d==1) echo "</pre>";   // HTML Only
}

使用方法:

$myarray=array(
    'mammals'=>array(
        'cats'=>array(
            'cheetah',
            'lion',
            'cougar'
        ),
        'dogs'=>array(
            'big'=>'Scooby',
            'small'=>'chihuahua',
            'medium'=>array(
                'pumi',
                'bulldog',
                'boxer'
            )
        ),
    ),
    'fish'=>'fish',
    'birds'=>array(
        'flying'=>array(
            'mallard',
            'condor',
            'gull'
        ),
        'nonflying'=>'emu'
    )
);

pretty_dump($myarray);

输出:

    mammals
        cats
            0   cheetah
            1   lion
            2   cougar
        dogs
            big Scooby
            small   chihuahua
            medium
                0   pumi
                1   bulldog
                2   boxer
    fish    fish
    birds
        flying
            0   mallard
            1   condor
            2   gull
        nonflying   emu

4
function printAll($a) {
    if (!is_array($a)) {
        echo $a, ' ';
        return;
    }

    foreach($a as $k => $value) {
         if($k<10){
             printAll($k);
             printAll($value);
        }
    }
}

1
只打印键值,不打印值。现在怎么打印值呢? - user1605871

2
function printAll($a) {
  foreach ($a as $k => $v) {
    echo $k, ' ';
  }

  printAllVals($a);
}

function printAllVals($a) {
  if (!is_array($a)) {
    echo $a, ' ';
      return;
   }

   foreach($a as $k => $v) {
     if ($k < 10) {
       printAllVals($v);
     }
   }
}

限制每个键少于9个值怎么样? - user1605871
可以运行。只有一个小问题。我想要能够打印出键,然后是键中的前9个值。然后打印下一个键,再打印键中的前9个值。现在,代码会先打印所有的键,然后再打印所有的值。我该如何改变这种情况? - user1605871
你的问题是说,“打印数组的键一次,然后打印所有的值”。 - Ian Atkin
抱歉,我的意思是一个键,然后9个值,另一个键,然后9个值。 - user1605871

2
print_r”,“var_dump”或“var_export”有什么问题吗?
另外,阅读关于“foreach”的文档,你将清楚地看到如何获取正在迭代的键。

0

尝试使用:

foreach($a as $k => $v)

其中$k是你的键,$v仍然是值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接