2010-02-24 2 views
0

У меня есть два массива, один с идентификаторами и один с именами:элегантный способ отображения двух массивов друг с другом

$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.

Какой самый элегантный способ добраться туда? Все методы, о которых я думаю, кажутся довольно грязными. Лучшее, что я подумал о том, чтобы извлечь из специальных элементов из каждого массива, и сделать сначала, а потом всё остальное, возможно, строить новый массив так:

$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

Если бы не было специальных идентификаторов, вы могли бы просто array_combine «d два массива. Вот как я думаю, что решить эту проблему:

Setup

$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(). creepy lol – goat

+0

@chris даже с теми же именами переменных? Oo: D – Gordon

+0

Я думал об использовании unset, тоже, но array_combine проскользнул мой разум. Это немного лучше. Прохладный, не знал, что вы можете добавить такие массивы. Спасибо. – sprugman

0

Являются ли массивы $ ids и $ names синхронизированными? (Делает 4 соответствуют «Алисе»?)

 

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

Выберите свой FAVE

+0

4 соответствует Алисе, но 13 должен соответствовать Чарльз, а не Боб. Вот в чем вопрос. (Извините, если я не был ясен.) – sprugman

0

Поскольку вы использовать индексы по умолчанию, вы можете использовать foreach() на keys($ids), чтобы получить индексы, так что вы можете перемещаться с помощью обоих массивов одновременно , Просто сравните значение текущего индекса $ids и используйте альтернативный индекс $names, если это необходимо.

+0

либо мой комментарий к @henasraf относится и к вам, либо я не понимаю ваше решение. Можете ли вы предоставить немного больше (псевдо) код? – sprugman

0

вы можете использовать array_combine и затем установить/добавить свои особые значения:

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

Это перезаписывает существующее имя при специальном идентификаторе (bob), а затем у вас есть charles дважды в массиве. Кроме того, $ special_id - это индекс имен $, а не само имя. – Gordon

+0

@gordon здесь мы встречаемся снова;) На этот раз вы правы, я поддержал ваше задание.(и изменил $ special_name в моем ответе, чтобы отразить природу индекса) – knittl

+0

thx. Я уверен, что мы будем чаще встречаться с течением времени;) приветствия! – Gordon

Смежные вопросы