Я хочу иметь возможность отображать многомерный ассоциативный массив в таблице. Массивы создаются с помощью 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
(
)
)
Как видно из первой строки вашего вывода, это не массив, а 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
Мне нужно больше поддельных интернет-точек для комментариев. Поэтому вместо этого вы получаете мой плохой ответ. Я бы попробовал вызов какой-то рекурсивной функции.
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-страницу.
Удачи.