Есть массив объектов термов, который перебираться с помощью foreach:
foreach( $terms as $term ) :
// code...
$hierarchy_terms = hierarchyTerms( $term->term_id, $tax, $terms );
// code...
endforeach;
Внутри тела foreach есть функция
hierarchyTerms()
, которая обрабатывает элементы массива и затем изменяет сам массив (удаляет элемент массива):
function hierarchyTerms( $termID, $taxonomy, &$terms_array )
{
$output = '';
$term_children = get_term_children( $termID, $taxonomy );
if( ! is_wp_error( $term_children ) && ! empty( $term_children ) ) {
$output .= '<div class="hierarchy-terms">';
$output .= '<ul>';
foreach ( $term_children as $child_id ) {
$output .= '<li>'. get_term( $child_id )->name.'</li>';
foreach ( $terms_array as $key => $val ) {
if( $val->term_id === $child_id ) {
unset( $terms_array[$key] );
}
}
}
$output .= '</ul>';
$output .= '</div>';
}
return $output;
}
Здесь при вызове функции
hierarchyTerms( $term->term_id, $tax, $terms )
в цикле foreach третий параметр $tax, $terms передаться по ссылке, что обеспечит изменение массива на лету. Но, по каким то причинам, этот массив $terms не изменяется и цикл foreach пробегается по всем ранее существующим элементам и не учитывает того, что были удалены в процессе перебора определенные элементы массива.