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