2011-12-28 8 views
2

j'ai besoin de combiner les clés d'un tableau, avec les valeurs dans un autre tableau:« array_combine » avec les tableaux associatifs

$a = array(4=>2000,5=>5000,7=>1000,3=>5000); 
$b = arrray(array(0=>0,1=>4,2=>10,3=>1000),array()...) 

C'est ce que j'ai écrit (ne fonctionne pas):

$keys = array_keys($a); 
foreach ($b as $k => $v) { 
array_combine($keys,$v); 
} 

ce que je vous attendre à obtenir est:

$c = array(array(4=>0,5=>4,7=>10,3=>1000),array(4=>...)); 

Répondre

1

Puisque b a plusieurs tableaux dans, vous aurez juste besoin de faire une itération simple b:

$a = array(4=>2000,5=>5000,7=>1000,3=>5000); 
$b = array(array(0=>0,1=>4,2=>10,3=>1000), array(0=>0,1=>4,2=>10,3=>1000)); 

$keys = array_keys($a); 
$length = count($keys); 
$c = array(); 
foreach($b as $sub) { 
    if(!is_array($sub)) { 
     $sub = array(); 
    } 

    $c[] = array_combine(array_pad($keys, count($sub), NULL), array_pad(array_values($sub), $length, NULL)); // Pad removes the possibility of a warning 
} 

print_r($c); 

Vous avez eu la bonne idée avec array_keys($a) et array_combine(). L'autre argument que vous avez besoin de pieds dans array_combine() est les valeurs, array_values($b). Mais puisqu'il y a plusieurs tableaux dans b, vous devez faire une boucle sur chacun d'entre eux. Comme une sécurité intégrée dans le cas où il y a plus ou moins paires de clé/valeur dans un ou l'un des sous-tableaux de b, j'ai ajouté array_pad() pour s'assurer que les deux tableaux transmis à array_combine() sont de longueur égale de sorte que PHP doesn ' Je me plains.

+0

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

+0

@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). –

3

Votre code est sur place près de:

$final=array(); 
$keys = array_keys($a); 
foreach ($b as $v) { 
    $final[]=array_combine($keys,$v); 
} 
2

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) 
    } 
} 
Questions connexes