如何在表中打印复杂的多维关联数组(PHP)

时间:2015-03-09 20:15:12

标签: php arrays loops solr solarium

我希望能够在表格中显示多维关联数组。这些数组由Solarium API创建,用于调试任何索引问题。每个数组都有不同数量的数组和键。

我想让它以任何数字或数组和键的方式保存。我开始使用foreach循环,但我在这一点上陷入困​​境。我该怎么做呢?

我到目前为止的代码:

foreach ($metadatas as $metadata) {
    foreach($metadata as $type => $data) {
        echo '<tr>';
            echo '<td>'.$type.'</td>';
            echo '<td>'.$data.'</td>';
        echo '</tr>';
    }
}

这是我使用print_r()得到的数组:

Solarium\QueryType\Extract\Query Object
(
    [options:protected] => Array
        (
            [handler] => update/extract
            [resultclass] => Solarium\QueryType\Extract\Result
            [documentclass] => Solarium\QueryType\Update\Query\Document\Document
            [omitheader] => 
            [extractonly] => 
            [uprefix] => ignored_
            [commit] => 1
            [file] => http://url.com/branch/files/2015/03/Client-Feedback-Form.doc
            [document] => Solarium\QueryType\Update\Query\Document\Document Object
                (
                    [boost:protected] => 
                    [modifiers:protected] => Array
                        (
                        )
                    [key:protected] => 
                    [fieldBoosts:protected] => Array
                        (
                            [id] => 
                            [site] => 
                            [description] => 
                            [url] => 
                            [title] => 
                        )
                    [version:protected] => 
                    [helper:protected] => Solarium\Core\Query\Helper Object
                        (
                            [placeHolderPattern:protected] => /%(L|P|T|)([0-9]+)%/i
                            [assembleParts:protected] => 
                            [derefencedParamsLastKey:protected] => 0
                            [query:protected] => Solarium\QueryType\Update\Query\Document\Document Object
 *RECURSION*
                        )
                    [filterControlCharacters:protected] => 1
                    [fields:protected] => Array
                        (
                            [id] => 227-7653
                            [site] => Branch Name
                            [description] => 
                            [url] => http://url.ca/branch/files/2015/03/Client-Feedback-Form.doc
                            [title] => Client Feedback Form
                        )
                )
        )
    [fieldMappings:protected] => Array
        (
            [content_type] => type
            [author] => authors
            [last_modified] => lastModifiedDate
            [creation_date] => creationDate
            [content] => content
        )

    [helper:protected] => 
    [params:protected] => Array
        (
        )
)

2 个答案:

答案 0 :(得分:0)

我需要更多虚假的互联网点来评论。相反,你得到我糟糕的答案。我尝试了某种递归函数调用。

function someFunction($table , $array){
  foreach($array as $key => $value){
      if(is_array($value)){
          someFunction(&$table, $value)
      }
      else {
          //Add to your existing $table
      }
  }
  return $table;
}
$table = someFunction("" , array());
显然,这是超级简单的观点。但这个想法是让你的表越来越深入到数组中。当你停止进入新阵列时,它最终会退出。我做了类似的事情,回过头来绕过一个DOMDocument()来构建一个超级复杂的XML。

但是,当您不知道阵列的可能大小或深度时,这才真正有用。如果你的数组有密钥,即使它是多维的,你知道它会存在或不会存在以及它们有多深。在评论中按照答案进行操作可能会更好,只需构建一个漂亮的HTML页面即可。

祝你好运。

答案 1 :(得分:0)

从输出的第一行可以看出,它不是一个数组,而是一个OBJECT!正如您在[options:protected]中看到的那样,它是受保护的变量,因此您无法从外部foreach循环访问它。 你可以做的是声明一个循环函数那个类:

class Query{
    ....
    ....
    public function iterate(){
        foreach ($this->options as $metadata) {
            foreach($metadata as $type => $data) {
                echo '<tr>';
                echo '<td>'.$type.'</td>';
                echo '<td>'.$data.'</td>';
                echo '</tr>';
            }
        }

    }
}

然后在课外召唤:

$object->iterate();

您可以在此处详细了解:http://php.net/manual/en/language.oop5.iterations.php