Sto cercando di creare un array con un ciclo foreach, ma l'array memorizza solo l'ultimo elemento

10 feb 2017, 20:44:52
Visualizzazioni: 38.8K
Voti: 0

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!

0
Tutte le risposte alla domanda 1
2

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);
    ?>
10 feb 2017 20:53:36
Commenti

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.

Ami Ami
11 feb 2017 01:03:00

Ah, e riguardo all'unset: ho testato e sembra non ci sia differenza se li uso o meno. Grazie mille per la tua utile risposta!

Ami Ami
11 feb 2017 01:07:40