элегантный способ сопоставить два массива друг с другом - PullRequest
0 голосов
/ 24 февраля 2010

У меня есть два массива, один с идентификаторами и один с именами:

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

, а затем выполняется через это, чтобы сделать фактическое обновление. Есть идея получше?

ОБНОВЛЕНИЕ: добавлено возможное решение выше. Тем временем пришло несколько ответов.

Ответы [ 4 ]

3 голосов
/ 24 февраля 2010

Если бы не специальные идентификаторы, у вас могло бы быть просто 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 голос
/ 24 февраля 2010

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

$mapped = array_combine($ids, $names);
$mapped[$special_id] = $names[$special_name];
0 голосов
/ 24 февраля 2010

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

0 голосов
/ 24 февраля 2010

Синхронизированы ли массивы $ 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')
}

Выберите свой любимый

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...