Чтобы работать с массивами, вложенными в массивы, вложенные в массивы (до бесконечности ...), вам нужно либо обработать каждый из них с помощью oop, либо создать Рекурсивную функцию , которая сделает это за вас.
В настоящее время я ведущий инженер сайта, который в значительной степени использует пользовательскую таксономию и терминологические структуры. Вот простая функция, которую я использую для построения полностью иерархического массива терминов таксономии:
function hierarchical_term_list( Array &$terms, Array &$into, $parent_id = 0 ){
foreach( $terms as $i => $term ){
if( $term->parent == $parent_id ){
$into[] = $term;
unset($terms[$i]);
}
}
foreach( $into as $top_term ){
$top_term->children = array();
hierarchical_term_list( $terms, $top_term->children, $top_term->term_id );
}
}
Теперь, когда я получу свой список терминов:
$terms = get_terms(array(
'hide_empty' => true,
'taxonomy' => 'some_tax',
'post_type' => 'some_post_type'
));
$hierarchy = array();
hierarchical_term_list( $terms, $hierarchy );
Это даст мне аккуратный массив WP_Term
объекты вроде этого (сокращены для краткости)
array(2) {
[0] => object(WP_Term)#1343 (12) {
["term_id"] => int(5)
["name"] => string(4) "Test"
…
["children"] => array(1) {
[0] => object(WP_Term)#1344 (12) {
["term_id"] => int(16)
["name"] => string(10) "Test Child"
…
["children"] => array(2) {
[0] => object(WP_Term)#1345 (12) {
["term_id"] => int(17)
["name"] => string(16) "Test Grand Child"
["slug"] => string(16) "test-grand-child"
…
["children"] => array(0) {}
}
[1] => object(WP_Term)#1346 (12) {
["term_id"] => int(18)
["name"] => string(20) "Favorite Grand Child"
["slug"] => string(20) "favorite-grand-child"
…
["children"] => array(0) {}
}
}
}
}
}
[1] => object(WP_Term)#1347 (12) {
["term_id"] =>int(1)
["name"] => string(13) "Childless"
["slug"] => string(13) "childless"
…
["children"] => array(0) {}
}
}
Теперь к важной части - как вы выводите эти массивы в массивы в массивы в массивы ... Это где Рекурсивная функция Я упомянул выше, чтобы играть.
Сначала нам нужно передать наш иерархический массив функции в качестве аргумента, а затем, если в нем есть children
, вызовите себя снова , вместо этого используя дочерний массив в качестве аргумента. Это будет продолжаться до тех пор, пока не останется больше детей, после чего он будет «go назад вверх» в глубине рекурсии, пока не перейдет к следующему члену, на ближайшем уровне, с которым еще не сталкивался .
Вот упрощенная версия функции, которую я использую:
function output_hierarchical_term_list( $terms ){
echo '<ul class="hierarchical-terms">';
foreach( $terms as $term ){
printf( '<li>%s', $term->name );
if( !empty( $term->children ) ){
output_hierarchical_term_list( $term->children );
}
echo '</li>';
}
echo '</ul>';
}
Это выведет что-то похожее на следующее:
<ul class="hierarchical-terms">
<li>
<strong>Test</strong>
<ul class="hierarchical-terms">
<li>
<strong>Test Child</strong>
<ul class="hierarchical-terms">
<li><strong>Test Grand Child</strong></li>
<li><strong>Favorite Grand Child</strong></li>
</ul>
</li>
</ul>
</li>
<li>
<strong>Childless</strong>
</li>
</ul>
Надеюсь, это поможет!