Как напечатать сложный многомерный ассоциативный массив в таблице (PHP)

0

Я хочу иметь возможность отображать многомерный ассоциативный массив в таблице. Массивы создаются с помощью API Solarium, который используется для отладки любых проблем с индексацией. Каждый массив имеет различное количество массивов и ключей.

Я хочу, чтобы он поддерживал его таким образом, чтобы он работал с любым числом или массивами и ключами. Я начал с использования цикла 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
        (
        )
)
  • 0
    это должно что-то повторять, если этот массив и подмассивы имеют это содержимое. Может быть, вы пытаетесь это в файле .html вместо файла .php?
  • 0
    @ n-dru Это ничего не повторяет. Файл .php, так как это плагин для WordPress.
Теги:
arrays
loops
solr
solarium

2 ответа

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

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-страницу.

Удачи.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню