Comme vous devez exécuter la même fonction sur chaque élément du tableau $b
:
$a = array(4=>2000,5=>5000,7=>1000,3=>5000);
$b = array(array(0,4,10,1000), array(0,4,10,40));
vous pouvez utiliser array_map
avec un rappel fonction. La fonction de rappel utilise ensuite array_combine
pour affecter vos clés aux valeurs. Puisque array_combine
doit avoir les touches pour fonctionner mais que le callback n'a que les valeurs en entrée, j'ai créé une fonction qui crée la fonction de rappel sur la base d'un tableau dont les touches seront prises pour l'opération array_combine
.
Comme les tableaux peuvent contenir des valeurs, certaines précautions sont prises. tableaux vides ne seront pas traitées du tout, des valeurs manquantes pour les clés spécifiques seront signalées comme NULL
:
$keyed = function($array)
{
$keys = array_keys($array);
// no keys, nothing to combine
if (!$len = count($keys)) {
return function($v) {return array();};
}
// default values are all NULL
$pad = array_fill(0, $len, NULL);
return function($values) use ($keys, $pad, $len)
{
// if input is not array, make it an empty array
!is_array($values) && $values = array();
return array_combine($keys, array_slice($values + $pad, 0, $len));
};
};
Le $keyed
est maintenant une fonction anonyme qui renverra la fonction de rappel pour array_map
en fonction de c'est le paramètre d'entrée pour les clés du tableau :
$c = array_map($keyed($a), $b);
Les fonctions anonymes sont disponibles en PHP depuis la version 5.3.
Sortie:
array(2) {
[0]=> array(4) {
[4]=> int(0)
[5]=> int(4)
[7]=> int(10)
[3]=> int(1000)
}
[1]=> array(4) {
[4]=> int(0)
[5]=> int(4)
[7]=> int(10)
[3]=> int(40)
}
}
Il manque le cas limite que 'Sub' de $ est pas un tableau (si vous voulez éviter les avertissements complets). De plus, je vous suggère de remplir le tableau avec des valeurs NULL au lieu de 0. J'ai utilisé une fonction de rappel anonyme pour que les clés fassent partie du rappel. Cela permet aussi de l'utiliser sur n'importe quelle valeur. Voir [ma réponse] (http://stackoverflow.com/a/8660676/367456). – hakre
@hakre J'ai supposé qu'il était implicite que '$ sub' serait toujours un tableau, mais cela pourrait facilement être accommodé si ce n'était pas le cas (bien que j'apprécie vos callbacks). –