Auteur: Gerard - 12 augustus 2009 - 11:20 - Gekeurd door: Richard - Hits: 3054 - Aantal punten: (0 stemmen)
Een standaard array_map implementatie geeft je de mogelijkheid om de callback van één functie toe te passen op één of meerdere arrays. Tijdens de ontwikkeling van mijn projecten kwam ik er echter achter dat ik het omgekeerde veel vaker gebruik; het toepassen van meerdere functies op één array. Een ander probleem waar ik tegenaan liep is het toepassen van array_map op een multi-dimensionale array, zoals bijvoorbeeld een formulier waarin je werkt met checkboxes met als naam "id[]".
Om dit probleem op te lossen heb ik een functie geschreven die het dus mogelijk maakt om meerdere functies uit te voeren op alle elementen van een array. Deze functie kan als volgt worden bekeken:
Een mogelijke implementatie van deze functie kan zijn als je bijvoorbeeld een resultaat hebt uit je database in de variabele $userInfo. Je wilt deze tonen op het scherm, maar eerst wil je natuurlijk nog even wat functies uitvoeren. De meest traditionele aanpak zou de volgende code kunnen opleveren:
Nou dit dit alles met zo'n kort stukje code nog niet echt bijzonder irritant. Wanneer je echter grote arrays gaat verwerken dan kan dit wel eens vervelend worden. Maar zoals gezegd zit het grootste voordeel in de recursieve mogelijkheid van deze functie. Bovenstaande code zou met deze functie er echter als volgt uitzien:
<?php
/**
* This function can be used to execute multiple functions and apply the callback to the elements of the
* given array. The default array_map implementation has support for only 1 function, but can handle
* several arrays to which the callback has to be applied. This function has support for only a single
* array, but is able to handle multiple functions. The function also has support for multi-dimensional
* arrays, as it's a recursive function.
*
* @author Gerard Klomp <gerard.klomp@sitemasters.be>
* @version 1.0
* @license http://sitemasters.be/mit-license.txt MIT License
* @param array $array The source array
* @param string $function The name of the function to be executed
* @return array An array containing all elements of the source array after applying the callback of each function.
*/
function array_map_recursive($array, $function)
{
$arguments = func_get_args();
if (!is_array($arguments[0]) && is_array($arguments[1]))
{
$temporary = $arguments[0];
$arguments[0] = $arguments[1];
$arguments[1] = $temporary;
unset($temporary);
}
$returnArray = array_shift($arguments);
foreach($returnArray as $key => $value)
{
if (is_array($value))
{
array_unshift($arguments, $value);
$value = call_user_func_array(__FUNCTION__, $arguments);
array_shift($arguments);
}
else
{
foreach ($arguments as $function)
{
if (function_exists($function))
{
$value = call_user_func($function, $value);
}
}
}
$returnArray[$key] = $value;
}
return $returnArray;
}
<?php
/**
* This function can be used to execute multiple functions and apply the callback to the elements of the
* given array. The default array_map implementation has support for only 1 function, but can handle
* several arrays to which the callback has to be applied. This function has support for only a single
* array, but is able to handle multiple functions. The function also has support for multi-dimensional