Sto cercando di creare un array con un ciclo foreach, ma l'array memorizza solo l'ultimo elemento
Il mio codice è:
<?php
//Ottieni i post dagli argomenti salvati nell'array $args
$vendor_postlist = get_posts( $args );
// Cicla la lista dei post ottenuti e per ogni post estrai la sua categoria prodotto e salvala in un array
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);
?>
Un po' di informazioni di background: sto cercando di creare uno shortcode che mostrerà una lista di prodotti (WooCommerce) in una tabella. Quindi $args memorizza gli argomenti come l'autore del post, il tipo di post ecc., alcuni dei quali vengono estratti dagli attributi dello shortcode.
Il problema sembra essere nel secondo ciclo foreach:
foreach ( $terms as $term ) {
$categories[] = $term->name;
echo $term->name;
}
L'echo serve solo per controllare se in questo punto visualizza correttamente i termini che dovrebbe mostrare. E infatti la lista dei termini visualizzata è corretta.
Esempio: Frutta, Verdura, Fiori
Ma quando uso print_r($categories) - che dovrebbe mostrare un array con le tre categorie - appare che solo l'ultima categoria è stata memorizzata nell'array: Array ( [0] => Fiori)
Ho bisogno di generare una tabella per ogni categoria, ecco perché sto cercando di creare l'array di categorie, ma sono bloccato su questo punto, non avendo idea di cosa potrebbe essere sbagliato.
Se qualcuno lo sa, per favore me lo faccia sapere. Sarei molto felice di risolvere questo problema. Grazie!

Prova questo codice. È necessario annullare quegli array nel foreach? Unset all'interno del ciclo rimuoverà i valori precedenti dell'array.
<?php
// Ottieni i post in base agli argomenti salvati nell'array $args
$vendor_postlist = get_posts( $args );
$categories = array();
// Cicla la lista dei post ottenuti...
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);
?>

Grazie, Abdul! Hai ragione! Spostando la riga: $categories = array(); prima del primo ciclo risolve il problema! Ora l'array memorizza tutti e 3 gli elementi. Dimostra quanto sia inesperto con la programmazione.
