2010-02-24 3 views
0

J'ai deux tableaux, l'un avec les ID et une avec les noms:façon élégante de carte deux tableaux à l'autre

$ids = array(4, 13, 6, 8, 10); 
$names = array('alice', 'bob', 'charles', 'david', 'elizabeth'); 

Je dois mettre à jour le db afin que les lignes avec les ids ont les noms dans le tableau. Voici le plus délicat: J'ai aussi deux ints:

$special_name = 2; // the index in $names, in this case we mean 'charles' 
$special_id = 13; // the id value 

Je ne me soucie pas de quel nom va à l'ID, à l'exception que le nom avec le $special_name devrait aller sur le $special_id.

Quelle est la manière la plus élégante d'y arriver? Toutes les méthodes auxquelles je pense semblent plutôt désordonnées. Le meilleur que je l'ai pensé est d'extraire les éléments spéciaux de chaque tableau, et faire en premier, puis le reste, peut-être la construction d'un nouveau tableau comme celui-ci:

$mapped = new array(); 
$mapped[$special_id] = $names[$special_name]; 
foreach ($ids as $id) { 
    if ($id != $special_id) { 
     $mapped[$id] = current($names); 
    } 
    // advance $names pointer 
    $next_name = next($names); 
    if ($next_name == $special_name) next($names); 
} 

Je ne l'ai pas testé que encore (je suis sur le point), mais il est censé produire quelque chose comme:

$mapped = array(13=>'charles', 4=>'alice',6=>'bob', 8=>'david', 10=>'elizabeth'); 

et en cours d'exécution, puis à travers ce faire la mise à jour réelle. Vous avez une meilleure idée?

MISE À JOUR: ajout de la solution possible ci-dessus. Pendant ce temps quelques réponses sont entrées.

Répondre

3

Si ce n'était pas pour les Ids spéciaux, vous pourriez avoir juste array_combine « d les deux tableaux. Voici comment je pense avoir résolu le problème:

Configuration

$ids = array(4, 13, 6, 8, 10); 
$names = array('alice', 'bob', 'charles', 'david', 'elizabeth'); 
$specialNameIndex = 2; 
$specialId = 13; 

Solution

$result = array($specialId => $names[$specialNameIndex]); 
    unset($ids[array_search($specialId, $ids)], 
     $names[$specialNameIndex]); 
    $result += array_combine($ids, $names); 

Résultat

print_r($result); 
Array 
(
    [13] => charles 
    [4] => alice 
    [6] => bob 
    [8] => david 
    [10] => elizabeth 
) 
+0

Incroyable. J'étais sur le point de publier une ligne pour la ligne exactement la même solution, sauf l'alimentation 2 args à unset(). creepy lol – goat

+0

@chris même avec les mêmes noms de variables? Oo: D – Gordon

+0

J'ai pensé à utiliser unset, aussi, mais array_combine a glissé dans mon esprit. Cela me semble un peu mieux. Cool, je ne savais pas que vous pouviez ajouter des tableaux comme ça. THX. – sprugman

0

Les tableaux $ ids et $ names sont-ils synchronisés? (Est-ce que 4 correspond à « alice »?)

 

for ($i=0; $i < count($ids); $i++) { 
    $indexed[$ids[$i]] = $names[$i]; // $indexed[4] = 'alice'; 
    $indexed2[] = array ($ids[$i] => $names[$i]); // $indexed[0] = (4 => 'alice') 
} 
 

Choisissez le votre Fave

+0

4 correspond à Alice, mais 13 est censé correspondre à Charles, pas Bob. C'est le but de la question. (Désolé si je n'étais pas clair.) – sprugman

0

Puisque vous utilisez les index par défaut, vous pouvez utiliser foreach() sur keys($ids) pour obtenir les indices afin que vous puissiez itérer les deux tableaux à la fois . Il suffit de comparer la valeur de l'indice actuel de $ids et d'utiliser l'index alternatif de $names le cas échéant.

+0

soit mon commentaire à @henasraf s'applique à vous aussi, ou je ne comprends pas votre solution. Pouvez-vous fournir un peu plus (pseudo) code? – sprugman

0

vous pouvez utiliser array_combine puis définir/ajouter vos valeurs spéciales:

$mapped = array_combine($ids, $names); 
$mapped[$special_id] = $names[$special_name]; 
+0

Cela écrase le nom existant à l'ID spécial (bob), puis vous avez eu deux charles dans le tableau. Aussi, $ special_id est l'index de $ names et non le nom lui-même. – Gordon

+0

@ gordon ici nous nous rencontrons à nouveau;) vous avez raison cette fois, j'ai upvoted votre qestion.(et changé $ special_name dans ma réponse pour refléter la nature d'un index) – knittl

+0

thx. Je suis sûr que nous nous rencontrerons plus souvent au fil du temps;) Bravo! – Gordon

Questions connexes