Concha Alviz | Front-end Developer

Entendiendo el foreach en PHP

Soy de letras. Este asunto de la programación me entra solo con sangre, así que puedo decir sin ningún tipo de vergüenza que me tomó mi tiempo saber qué narices era un foreach en PHP. A veces, te sueltan toda esa teoría de lo que es una condicional if/else o que es un for, un while o un foreach, pero de ahí a buscarle una aplicación en el mundo real va un trecho.

En este artículo, intentaré explicar con un ejemplo real cómo se utiliza un foreach y en qué momentos puede venirnos de perlas.

Una vez leí que, en programación, cuando repites más de una vez un código, es que estás haciendo algo más. La redundancia, en la mayor parte de los casos, puede combatirse con programación. Seguro que algún tipo de loop o función puede ayudarnos a que un código que, a veces, ocupa cientos de líneas, se desarrolle en unas cuantas. ¿Y qué me decís de la satisfacción que da eso?

¿Qué es un foreach?

El manual de php nos dice que el foreach es un constructor que «proporciona un modo sencillo de iterar sobre arrays. foreach funciona sólo sobre arrays y objetos, y emitirá un error al intentar usarlo con una variable de un tipo diferente de datos o una variable no inicializada». También dice que hay dos maneras de utilizarlo en cuanto a la sintaxis:

foreach (expresión_array as $valor)
    sentencias
foreach (expresión_array as $clave => $valor)
    sentencias

Un ejemplo práctico

Imaginad que tenemos una galería conformada de fotografías que queremos filtrar por categorías. Cuando cargue, deberá mostrar todos los elementos, sin discriminar por categorías; sin embargo, por medio de una serie de botones en la parte superior, podremos fácilmente filtrar por categorías que serán tres: animales, paisajes y personas.

Supongo que habría muchas formas de hacerlo. Estoy segura de que a cada uno se nos ocurriría llevar a cabo el proyecto con diferentes lenguajes y técnicas. Sin embargo, supongamos que lo hacemos mediante javascript, y que el query que mostrará cada una de las fotografías por categorías, aparecerá o desaparecerá según dispongamos. Lo que identificará cada uno de los divs contenedores será la class que tengan.

De una manera muy poco fina y masiva, este sería nuestro código:

<div class="show-all">
	<?php query_posts(array('post_type' => array('photo'), 'posts_per_page' => -1, 'orderby' => 'date', 'order' => 'ASC', )); while ( have_posts() ) : the_post(); ?>
	<div>
		<span><?php the_post_thumbnail( 'portfolio' ); ?></span>
	</div>';
	<?php endwhile; wp_reset_query(); ?>
</div>
<div class="show-animals">
	<?php query_posts(array('post_type' => array('photo'), 'posts_per_page' => -1, 'orderby' => 'date', 'order' => 'ASC', 'category_name' => 'animals', )); while ( have_posts() ) : the_post(); ?>
	<div>
		<span><?php the_post_thumbnail( 'portfolio' ); ?></span>
	</div>';
	<?php endwhile; wp_reset_query(); ?>
</div>
<div class="show-people">
	<?php query_posts(array('post_type' => array('photo'), 'posts_per_page' => -1, 'orderby' => 'date', 'order' => 'ASC', 'category_name' => 'people', )); while ( have_posts() ) : the_post(); ?>
	<div>
		<span><?php the_post_thumbnail( 'portfolio' ); ?></span>
	</div>';
	<?php endwhile; wp_reset_query(); ?>
</div>
<div class="show-landscapes">
	<?php query_posts(array('post_type' => array('photo'), 'posts_per_page' => -1, 'orderby' => 'date', 'order' => 'ASC', 'category_name' => 'landscapes', )); while ( have_posts() ) : the_post(); ?>
	<div>
		<span><?php the_post_thumbnail( 'portfolio' ); ?></span>
	</div>';
	<?php endwhile; wp_reset_query(); ?>
</div>

¿Mucha redundancia, verdad? Al fin y al cabo, repetimos el mismo código cuatro veces y solo cambiamos dos datos en cada parte. Todo esto puede solucionarse utilizando foreach. En primer lugar, crearemos una array:

$type_photo = array (
	'show-all' => '',
	'show-animals' => 'animals',
	'show-landscapes' => 'landscapes',
	'show-people' => 'people'
);

Podríamos simplificar mucho más la array, pero la haremos así como ejemplo. La estructura básica de este array sería:

$variable = array (
	$key => $value,
);

Por lo tanto, podríamos crear este tipo de foreach:

foreach($type_photo as $key => $value) {
	echo '<div class="'. $key .'">';
		query_posts(array('post_type' => array('projects'), 'posts_per_page' => -1, 'orderby' => 'date', 'order' => 'ASC', 'category_name' => $value, )); while ( have_posts() ) : the_post();
		echo '<div><span>';
		the_post_thumbnail( 'portfolio' );
                echo '</span></div>';
		endwhile; wp_reset_query();
	echo '</div>';
}

La diferencia es notable, ¿verdad? Básicamente lo que hemos hecho es sustituir las partes que cambiaban por $key y $value, que según en el momento del loop del foreach en el que se encuentren, tendrán un valor u otro. Ni más ni menos que el que marca el array. ¡Facilísimo!

 

Salir de la versión móvil