Я пытаюсь создать массив с помощью цикла foreach, но массив сохраняет только последний элемент

10 февр. 2017 г., 20:44:52
Просмотры: 38.8K
Голосов: 0

Мой код:

<?php
//Получаем записи по аргументам, сохраненным в массиве $args
$vendor_postlist = get_posts( $args );

// Перебираем список полученных записей и для каждой записи извлекаем категорию продукта и сохраняем в массив
foreach ( $vendor_postlist as $post ){  

$terms = get_the_terms( $post->ID, 'product_cat' );
$categories = array();

foreach ( $terms as $term ) {
$categories[] = $term->name;
echo $term->name;
}

unset( $term );
}

unset( $post );
print_r($categories);
?>

Немного справочной информации: я пытаюсь создать шорткод, который будет отображать список продуктов (WooCommerce) в таблице. Таким образом, $args хранит аргументы, такие как автор записи, тип записи и т.д., некоторые из которых извлекаются из атрибутов шорткода.

Проблема, похоже, во втором цикле foreach:

foreach ( $terms as $term ) {
$categories[] = $term->name;
echo $term->name;
}

Echo используется только для проверки правильности отображения терминов на этом этапе. И действительно, отображаемый список терминов правильный.

Пример: Фрукты, Овощи, Цветы

Но когда я использую print_r($categories) - который должен был отобразить массив с тремя категориями - оказывается, что в массиве сохранена только последняя категория: Array ( [0] => Цветы)

Мне нужно создать таблицу для каждой категории, поэтому я пытаюсь создать массив категорий, но я застрял на этом моменте, не имея понятия, что может быть не так.

Если кто-то знает, пожалуйста, дайте мне знать. Я был бы очень рад решить эту проблему. Спасибо!

0
Все ответы на вопрос 1
2

Попробуйте этот код. Нужно ли здесь сбрасывать массивы в foreach? Использование unset внутри цикла удалит предыдущие значения массива.

<?php
    // Получаем записи по аргументам, сохраненным в массиве $args
    $vendor_postlist = get_posts( $args );
    $categories = array();
    // Цикл по списку полученных записей...
    foreach ( $vendor_postlist as $post ){  

    $terms = get_the_terms( $post->ID, 'product_cat' );


    foreach ( $terms as $term ) {
    $categories[] = $term->name;
    echo $term->name;
    }

    }

    print_r($categories);
    ?>
10 февр. 2017 г. 20:53:36
Комментарии

Спасибо, Абдул! Ты прав! Перенос строки: $categories = array(); перед первым циклом решает проблему! Теперь массив хранит все 3 элемента. Это показывает, насколько я неопытен в программировании.

Ami Ami
11 февр. 2017 г. 01:03:00

Ах да, насчет unset: я проверил и кажется нет разницы, использую я их или нет. Большое спасибо за твой полезный ответ!

Ami Ami
11 февр. 2017 г. 01:07:40