2010-02-24 31 views
0

我有两个阵列,一个用ID和一个与名称:优雅的方式来两个数组相互映射

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

我需要让与IDS行具有名来更新数据库在数组中。这里是有点棘手:我也有两个整数:

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

我不关心这名去哪个ID,除了与$special_name名称应走在$special_id

什么是最优雅的方式到达那里?所有我想到的方法似乎都很混乱。我认为最好的是提取出每个阵列的特殊物品,并做那些第一,然后做休息,也许是建立一个新的数组是这样的:

$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); 
} 

我没有测试过但(我要),但它的意思产生类似:

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

,然后通过运行做实际的更新。有更好的主意吗?

更新:添加上面的可能的解决方案。同时有几个答案已经进来。

回答

3

如果不是因为特殊的ID,你可能只是array_combine倒是两个数组。这里是我认为已经解决了这个问题:

设置

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

解决方案

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

结果

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

令人难以置信。我正准备发布一行完全相同的解决方案,除了将2个参数传递给unset()。令人毛骨悚然的大声笑 – goat 2010-02-24 20:18:34

+0

@chris甚至具有相同的变量名称? Oo:D – Gordon 2010-02-24 20:20:38

+0

我也考虑过使用unset,但是array_combine放弃了我的想法。这感觉好一点。很酷,不知道你可以添加这样的数组。谢谢。 – sprugman 2010-02-24 20:38:26

0

$ ids和$ names数组是否同步? (难道4对应于“爱丽丝”?)由于您使用默认的索引,你可以使用keys($ids)foreach()获得索引,使您可以一次通过两个阵列迭代

 

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') 
} 
 

挑选你最喜欢的

+0

4对应于爱丽丝,但13应该对应于查尔斯,不是鲍勃。这是问题的关键。 (对不起,如果我不清楚。) – sprugman 2010-02-24 20:10:59

0

。只需比较当前索引$ids的值,并在适当时使用替代索引$names

+0

我对@henasraf的评论也适用于你,或者我不理解你的解决方案。你能提供更多(伪)代码吗? – sprugman 2010-02-24 20:12:44

0

可以使用array_combine然后设置/添加您的特殊值:

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

这会覆盖特殊ID(bob)处的现有名称,然后在数组中查找两次charles。另外,$ special_id是$ names的索引,而不是名称本身。 – Gordon 2010-02-24 20:19:17

+0

@gordon在这里,我们再次见面;)这一次你是对的,我提出了你的问题。(并在我的答案中更改了$ special_name以反映索引的性质) – knittl 2010-02-24 21:04:01

+0

thx。我相信随着时间的推移,我们会更频繁地见面;)欢呼! – Gordon 2010-02-24 21:37:11

相关问题