Задать вопрос
@alex0176

Как изменить массив на лету внутри цикла foreach?

Есть массив объектов термов, который перебираться с помощью 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 пробегается по всем ранее существующим элементам и не учитывает того, что были удалены в процессе перебора определенные элементы массива.
  • Вопрос задан
  • 157 просмотров
Подписаться 1 Средний 9 комментариев
Пригласить эксперта
Ответы на вопрос 1
@samyside
foreach ( $terms_array as $key => $val ) {
                if( $val->term_id === $child_id ) {						
			unset( $terms_array[$key] );						
		}
            }


Надо еще здесь обращаться по ссылке к элементам массива, иначе они не изменяются:

foreach ( $terms_array as $key => &$val ) {
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы