Estoy tratando de crear un array con un bucle foreach, pero el array solo almacena el último elemento

10 feb 2017, 20:44:52
Vistas: 38.8K
Votos: 0

Mi código es:

<?php
//Obtener posts mediante los argumentos guardados en el array $args
$vendor_postlist = get_posts( $args );

// Recorrer la lista de posts obtenida y para cada post extraer su categoría de producto y guardarla en 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 poco de información de contexto: Estoy tratando de crear un shortcode que mostrará una lista de productos (WooCommerce) en una tabla. Entonces $args almacena los argumentos como el autor del post, el tipo de post, etc., algunos de ellos extraídos de los atributos del shortcode.

El problema parece estar en el segundo bucle foreach:

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

El echo es solo para verificar si muestra correctamente en este punto los términos que se supone que debe mostrar. Y de hecho, la lista de términos mostrada es correcta.

Ejemplo: Frutas, Verduras, Flores

Pero cuando uso print_r($categories) - que se suponía que debía mostrar un array con las tres categorías - solo aparece almacenada en el array la última categoría: Array ( [0] => Flores)

Necesito generar una tabla para cada categoría, por eso estoy tratando de crear el array de categorías, pero estoy atascado en este punto, sin tener idea de qué podría estar mal.

Si alguien sabe, por favor háganmelo saber. ¡Estaría muy feliz de resolver este problema. ¡Gracias!

0
Todas las respuestas a la pregunta 1
2

Prueba este código. ¿Es necesario liberar esos arrays en el foreach? Unset dentro del bucle eliminará los valores anteriores del array.

<?php
    // Obtener posts usando los argumentos guardados en el array $args
    $vendor_postlist = get_posts( $args );
    $categories = array();
    // Recorrer la lista de posts obtenidos...
    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
Comentarios

¡Gracias, Abdul! ¡Tienes razón! Mover la línea: $categories = array(); antes del primer bucle resuelve el problema. Ahora el array almacena los 3 elementos. Demuestra lo inexperto que soy con la programación.

Ami Ami
11 feb 2017 01:03:00

Ah, y sobre el unset: probé y parece que no hay diferencia si los uso o no. ¡Muchas gracias por tu útil respuesta!

Ami Ami
11 feb 2017 01:07:40