Как распечатать все значения из массива, он печатает только сначала? - PullRequest
0 голосов
/ 29 января 2020

У меня проблема и я не могу ее решить.

// get list of categories
$terms = $listing->get_field( 'region' );

foreach($terms as $t){
    $parent_category = mg_get_term_parents( $t->term_id, 'region' );
}

Когда я сбрасываю parent_category, я получаю массив (он печатает только прародитель и родитель) для нижнего дочернего кода.

array(2) {
  [0]=>
  object(WP_Term)#6446 (10) {
    ["term_id"]=>
    int(213)
    ["name"]=>
    string(8) "Americas"
    ["slug"]=>
    string(8) "americas"
    ["term_group"]=>
    int(0)
    ["term_taxonomy_id"]=>
    int(213)
    ["taxonomy"]=>
    string(6) "region"

  }
  [1]=>
  object(WP_Term)#6448 (10) {
    ["term_id"]=>
    int(157)
    ["name"]=>
    string(13) "United States"
    ["slug"]=>
    string(13) "united-states"
    ["term_group"]=>
    int(0)
    ["term_taxonomy_id"]=>
    int(157)
    ["taxonomy"]=>
    string(6) "region"   
  }
}

или я получаю массив, если прародитель не представлен

object(WP_Term)#6454 (10) {
  ["term_id"]=>
  int(214)
  ["name"]=>
  string(4) "EMEA"
  ["slug"]=>
  string(4) "emea"
  ["term_group"]=>
  int(0)
  ["term_taxonomy_id"]=>
  int(214)
  ["taxonomy"]=>
  string(6) "region"
}

Если у меня есть только родитель и ребенок, я использую следующее, и это дает мне хорошие результаты. Но не уверен, что нужно добавить сюда, чтобы охватить все случаи.

foreach( $terms as $t )
{
    if ( $parent_category = mg_get_term_parents( $t->term_id, 'region' ) )
    {
        array_unshift( $terms, $parent_category );
    }
}


$formatted_terms = array_filter( array_map( function( $term ) {
    if ( ! $term = \MyListing\Src\Term::get( $term ) ) {
        return false;
    }

        return [
        'link' => $term->get_link(),
        'name' => $term->get_name(),
        'color' => $term->get_color(),
        'text_color' => $term->get_text_color(),
        'icon' => $term->get_icon( [ 'background' => false, 'color' => false] ),
        ];

    }, $terms ) );

Проблема возникает, когда у меня есть дедушка, родитель и ребенок. Решение, приведенное выше, не работает.

Если я использую

$formatted_terms = array_filter( array_map( function( $term ) {
        if ( ! $term = \MyListing\Src\Term::get( $term ) ) {
            return false;
        }

            return [
            'link' => $term->get_link(),
            'name' => $term->get_name(),
            'color' => $term->get_color(),
            'text_color' => $term->get_text_color(),
            'icon' => $term->get_icon( [ 'background' => false, 'color' => false] ),
            ];

        }, $terms ) );

, я печатаю только 1 область из массива и ту, которая отсутствует, которая является дочерней. Массив выводит только родителя и деда. Мне нужно как-то добавить вывод массива в код выше tog et все необходимое.

Любая идея, как сделать sh это?

1 Ответ

0 голосов
/ 29 января 2020

Чтобы работать с массивами, вложенными в массивы, вложенные в массивы (до бесконечности ...), вам нужно либо обработать каждый из них с помощью 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>

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...