Я пытаюсь создать массив с помощью цикла foreach, но массив сохраняет только последний элемент
Мой код:
<?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] => Цветы)
Мне нужно создать таблицу для каждой категории, поэтому я пытаюсь создать массив категорий, но я застрял на этом моменте, не имея понятия, что может быть не так.
Если кто-то знает, пожалуйста, дайте мне знать. Я был бы очень рад решить эту проблему. Спасибо!

Попробуйте этот код. Нужно ли здесь сбрасывать массивы в 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);
?>

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