2010-02-24 34 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

相關問題