优雅的方式将两个数组相互映射

时间:2010-02-24 19:43:08

标签: php arrays mapping

我有两个数组,一个有ID,另一个有Names:

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

然后通过它来执行实际更新。有更好的主意吗?

更新:添加了上述可能的解决方案。与此同时,还有几个答案。

4 个答案:

答案 0 :(得分: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
)

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

$ ids和$ names数组是否已同步? (4对应'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')
}

选择你最喜欢的

答案 3 :(得分:0)

由于您使用默认索引,因此可以在foreach()上使用keys($ids)来获取索引,以便您可以一次迭代两个数组。只需比较当前索引$ids的值,并在适当时使用替代索引$names