0

我有一个只读的多维关联数组,我需要从中提取特定值以生成带有某些值的输出。

数组如下所示:

array (
'Dogs' => 
array (
0 => 
array (
  'Name' => 'Big Dogs',
  'ID' => '32',
  'Brown dogs' => 
  array (
    0 => 
    array (
      'Name' => '4 legged dogs',
      'Retrievers' => 
      array (
        0 => 
        array (
          'Name' => 'Fido',
          'ID' => '11',
          'Owner' => 'Billy',
          'IsaBiter' => true,
        ),
      ),
    ),
    1 => 
    array (
       'Name' => '3 legged dogs',
       'Retrievers' => 
        array (
        0 => 
        array (
           'Name' => 'Spot',
          'ID' => '12',
          'Owner' => 'Sally',
          'IsaBiter' => false,
        ),
      ),
    ),

ETC..

还有一个嵌套的 foreach 循环,它贯穿数组,可以打印数组的所有值,如下所示:

echo "<ul>";
 foreach($myArray as $arr1 => $val1) { 
  foreach($val1 as $arr2 => $val2) {
    foreach($val2 as $val3) {
     echo "<li>" . $val3 . "<ul>";
         foreach($val3 as $arr4 => $val4) {
         foreach($val4 as $arr5 => $val5) {
         echo "<li>" . $val5;
        foreach($val5 as $arr6 => $val6) {
        //echo $val6;
                foreach($val6 as $arr7 => $val7) {
            echo $val7 . "<br />"; //dumps the details
                    }
                    echo "</li>";
               }
                 }             
        }
        echo "</ul>";
        echo "</li>";
       }
   }
}

理想情况下,我希望能够 1)排除我不想显示的值(ID、某些数组级别名称等,目前它显示全部)和 2)显示特定的值(即名称、所有者、IsaBiter),以便我可以格式化结果更干净,类似于:

Big Dogs
   Brown Dogs
     Retrievers
       Name: Fido
       Owner: Billy
       IsaBiter: true

       Name: Spot
       Owner: Sally
       IsaBiter: false
4

1 回答 1

1

这是一个接近匹配你想要的递归函数的开始。

function displayArray($array, $level = 0) {
  // This filter determines which levels are displayed
  $visible = in_array($level, array(0,2,4,6));

  if ($visible) {
    echo '<ul>';
    foreach($array as $key => $value) { 
      if (is_array($value)) {
        echo '<li>';
        echo $key;
        displayArray($value, $level + 1);
        echo '</li>';
      }                    
      else {
        // This filter determines which non-array keys are displayed
        $visible = $level == 6 and in_array($key, array('Name','Owner','IsaBiter'));

        if ($visible) {
          if (is_bool($value)) $value = $value ? "true" : "false";
          echo '<li>';
          echo "$key : $value"; 
          echo '</li>';
        }  
      }
    }
    echo '</ul>';
  }  
  else {
    // If a level is not visible, we still try and display child arrays

    foreach($array as $key => $value)
      if (is_array($value))
        displayArray($value, $level + 1);
  }                           
}

我已经展示了如何过滤掉特定级别和特定键,但您可能需要做更多的事情才能获得所显示的确切输出。

首先,在您的示例中,您只显示了一次“Retrievers”,尽管“Fido”和“Spot”实际上来自两个独立的“Retrievers”数组(4 条腿的猎犬和 3 条腿的猎犬)。我不确定这是否是故意的,如果是这样,该规则应该如何运作。

其次,您将“Big Dogs”显示为好像它是顶级数组的键,而实际上它是该数组中项目的其中一个子项的“名称”值。同样,如果这是故意的,我不完全确定要确定要显示的内容和方式的规则是什么。

如果此答案不足以让您自己弄清楚其余部分,则需要提供更多示例数据和示例输出,以便我可以准确确定您要达到的目标。

于 2013-06-21T22:18:12.553 回答