开发者

elegant way to map two arrays to each other

开发者 https://www.devze.com 2022-12-21 07:40 出处:网络
I\'ve got two arrays, one with IDs and one with Names: $ids = array(4, 13, 6, 8, 10); $names = array(\'alice\', \'bob\', \'charles\', \'david\', \'elizabeth\');

I've got two arrays, one with IDs and one with Names:

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

I need to update the db so that the rows with the ids have the names in the array. Here's the tricky bit: I also have two ints:

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

I don't care about whi开发者_如何学运维ch name goes to which id, except that the name with the $special_name should go on the $special_id.

What's the most elegant way to get there? All of the methods that I'm thinking of seem pretty messy. The best I've thought of is to extract out the special items from each array, and do those first, and then do the rest, perhaps building a new array like this:

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

I haven't tested that yet (I'm about to) but it's meant to produce something like:

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

and then running through that to do the actual update. Got a better idea?

UPDATE: added the possible solution above. Meanwhile a couple answers have come in.


If it wasn't for the special Ids, you could have just array_combine'd the two arrays. Here is how I think to have solved the issue:

Setup

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

Solution

  $result = array($specialId => $names[$specialNameIndex]);
  unset($ids[array_search($specialId, $ids)], 
        $names[$specialNameIndex]);
  $result += array_combine($ids, $names);

Result

print_r($result);
Array
(
    [13] => charles
    [4] => alice
    [6] => bob
    [8] => david
    [10] => elizabeth
)


you can use array_combine and then set/append your special values:

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


Are the $ids and $names arrays synced? (Does 4 correspond to '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')
}

Pick your fave


Since you use the default indexes you can use foreach() on keys($ids) to get the indexes so that you can iterate through both arrays at once. Just compare the value of the current index of $ids and use the alternate index of $names when appropriate.

0

精彩评论

暂无评论...
验证码 换一张
取 消