Fonction PHP du jour : array_chunk()

Nous avons vu précédemment la fonction Levenshtein, permettant de calculer une distance entre deux mots.

Aujourd’hui, je vais vous présenter la fonction array_chunk(). Pour les « pros » de PHP, cela ne sera peut-être pas intéressant, mais même après des années de programmation, on passe parfois à coté de fonctions pouvant se révéler bien utiles.

Son rôle

Nous pourrions traduire « array chunk » par « morceau de tableau » (non ?). Donc, la fonction array_chunk() va simplement diviser la tableau en plusieurs morceaux suivant les paramètres passés à la fonction. On ne peut mieux expliquer je pense.

Prototype

array array_chunk (array $input , int $size [, bool $preserve_keys = false ])

(source : PHP.net bien sûr)

$size contient un entier représentant la taille des tableaux. Sa valeur doit être supérieur ou égale à 1.
$preserve_keys, comme son nom l’indique, permet de préserver les clés des tableaux. C’est donc un booléen.

Exemple d’utilisation

J’ai récemment utilisé cette fonction dans le cadre d’un de mes projets, pas plus tard que cette semaine. Je devais imprimer une liste de vignettes, peu importe le contenu, ce n’est pas le sujet.

Donc, pour faire simple, je place l’une derrière l’autre les vignettes, je lance l’impression vers fichier PDF (on ne va pas gaspiller des feuilles de papier inutilement voyons). Et la tâche sait vu plus compliquée que prévu. Voyez par vous même :

En rouge, vous voyez les bordures des pages et en bleu les vignettes. Vous remarquez qu’en fin de page, deux vignettes sont coupées en deux, ce n’est pas bon du tout.

Le problème logique, mais qu’on ne prévoit pas forcément 😀

L’idée est donc d’afficher un nombre défini de vignettes par page. Ici, une page peut contenir 8 vignettes sans voir son contenu tronqué. Comme le contenu flottant déconne avec l’impression sur PDF, je décide de créer un affichage avec un tableau par page. Je défini aussi une hauteur de 28cm aux tableaux, permettant de simuler le passage à une autre page.

Mes données sont contenues dans un « array », je vous fais donc une première version sans utiliser array_chunk, et une autre version en l’utilisant.

Sans array_chunk

<?php

$nbVignettes = 16;

/**
 * Générateur de vignette pour les feignasses
 */
$vignettes = array();
for ($i = 1; $i <= $nbVignettes; $i++) {
	$vignettes[] = 'Vignettes '.$i;
}
// $vignettes = array('Vignette 1', 'Vignette 2', ..., 'Vignette 16');

$tmp = array();
// cette boucle permet de grouper par 2 et ensuite par 4
for ($x = 2; $x < 5; $x = $x + 2) {
	$tmp = array();
	$nbVignettes = count($vignettes);
	for ($i = 0, $j = 0, $c = 0; $i < $nbVignettes; $i++) {
		$tmp[$j][] = $vignettes[$i];
		$c++;
		if ($c == $x) {
			$j++;
			$c = 0;
		}
	}
	$vignettes = $tmp;
}
unset($vignettes);
$groupesVignettes = $tmp;
?>
<?php foreach ($groupesVignettes AS $groupeVignettes) : ?>
<table style="height: 28cm;">
	<?php foreach ($groupeVignettes AS $vignettes) : ?>
	<tr>
		<?php foreach ($vignettes AS $vignette) : ?>
		<td><?php echo $vignette; ?></td>
		<?php endforeach; ?>
	</tr>
	<?php endforeach; ?>
</table>
<?php endforeach; ?>

Avec array_chunk

<?php

$nbVignettes = 16;

/**
 * Générateur de vignette pour les feignasses
 */
$vignettes = array();
for ($i = 1; $i <= $nbVignettes; $i++) {
	$vignettes[] = 'Vignettes '.$i;
}
// $vignettes = array('Vignette 1', 'Vignette 2', ..., 'Vignette 16');

/**
 * on forme des groupes de 2, ensuite des groupes de 4.
 * Permet de faire 4 ligne de 2 colonne de vignette.
 */
$groupesVignettes = array_chunk(array_chunk($vignettes, 2), 4);
?>
<?php foreach ($groupesVignettes AS $groupeVignettes) : ?>
<table style="height: 28cm;">
	<?php foreach ($groupeVignettes AS $vignettes) : ?>
	<tr>
		<?php foreach ($vignettes AS $vignette) : ?>
		<td><?php echo $vignette; ?></td>
		<?php endforeach; ?>
	</tr>
	<?php endforeach; ?>
</table>
<?php endforeach; ?>

Conclusion

On voit que pour former des groupes de données, la fonction est vraiment utile. Au niveau du benchmark, je n’ai aucune idée de lequel de ces codes est le plus performant. Mais j’ai déjà lu plusieurs fois que les fonctions natives étaient régulièrement plus adaptées qu’un code maison en PHP. Bien sûr, il existe des exceptions.

Qu’en pensez-vous, elle n’est pas utile ?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Notifiez-moi des commentaires à venir via email. Vous pouvez aussi vous abonner sans commenter.