2010-02-24 8 views
0
나는 두 개의 배열, 이름과 ID로 하나 하나있어

: 나는 ID를 가진 행이 이름을 가질 수 있도록 DB를 업데이트해야우아한 방법 서로

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

을 배열에. 여기에 까다로운 비트는 다음과 같습니다

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

난 상관 없어 어떤에 대해 이름이 $special_name와 이름이 $special_id에 가야한다는 점을 제외하는 ID에 간다 : 나는 또한 두 개의 int 치의 있습니다.

가장 우아한 방법은 무엇입니까? 내가 생각하고있는 모든 방법들은 꽤 지저분 해 보인다.

$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

인크 레 더블. unset()에 2 개의 args를 넘겨주는 것을 제외하고는 똑같은 해결책을 줄 줄을 올리려고했습니다. 같은 변수 이름을 가지고도 @chris에 오싹 해지는 – goat

+0

? Oo : D – Gordon

+0

unset도 사용하려고 생각했지만 array_combine이 내 마음을 어지럽게했습니다. 기분이 좀 나아 졌어. 멋지다, 그런 배열을 추가 할 수 있는지 몰랐다. 고마워. – sprugman

0

$ ids 및 $ 이름 배열이 동기화되어 있습니까? ('앨리스'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

0

선택 . 적절한 경우 현재 색인의 값을 $ids과 비교하고 $names의 대체 색인을 사용하십시오.

+0

@henasraf에 대한 내 의견은 귀하에게도 적용되거나 귀하의 솔루션을 이해하지 못합니다. 좀 더 (의사) 코드를 제공 할 수 있습니까? – sprugman

0

당신은 당신의 특별한 값을 추가/array_combine 다음 설정 사용할 수 있습니다

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

이것은 특수 ID (bob)에 기존 이름을 덮어 쓴 다음 어레이에서 찰스를 두 번 사용했습니다. 또한 $ special_id는 $ names의 인덱스이며 이름 자체는 아닙니다. – Gordon

+0

여기 @gordon 우리는 다시 만난다.) 당신은 이번에는 당신의 질문을 upvoted.(그리고 내 대답은 인덱스의 성격을 반영하기 위해 $ special_name을 변경했습니다) – knittl

+0

thx. 나는 우리가 시간이 지남에 따라 자주 만날 것이라고 확신합니다.) 환호! – Gordon

관련 문제