CakePHP - 从用户处理数组的最佳方式

For an application I am building with CakePHP, I want the user to be able to enter any number of tags, from a specific set of possibilities (a bit like the category tags of stackoverflow).

I actually got a working code, but it seems very ugly to me. I will outline my approach bellow, along with improvements I want to make in boldface. My apologies for not having a specific questions, but as an autodidact I can really use the feedback. Any suggestions would be dearly appreciated!

I let the users select their options from a list using Html -> select():

$options = array(
    //...
   );

echo $this->Form->select(
    'Tag.tag_name',
    $options,
    array('multiple' => true)
);

I would rather have the user type their choice and then options coming up. Ideally, the tag would appear after that, with a clickable cross to remove it again (like in Evernote Webtagger). Does anyone know any javascripts that are available for this task?

Then the serverside. Based on other posts I read on stackoverflow, I decided to create a seperate table to store the tags (I want them to be easily searchable). The data is stored their from another controller, of an object that has a hasMany association with the tag table. The code to store stuff for the first time seems fine, but the user should be able to edit it later. How I go about this now is to simply destroy all the db objects in the tag table associated with the current post, and then add all the tags that came back from the form again. Here are the relevant parts of my code:

            $profile = $this -> select(); // select() is a private function that returns the current profile, based on Auth id

            //destroy old ones
            foreach($profile['Tag'] as $tag):
                $this -> Profile -> Tag -> delete($tag['id']);
            endforeach;

            //create new ones
            foreach ($this -> request -> data['Tag']['tag_name'] as $tag):
                $this -> Profile -> Tag -> create();
                $entry['tag_name'] = $tag;
                $entry['profile_id'] = $this -> Profile -> id;
                $this -> Profile -> Tag -> save($entry);
            endforeach;

My experience with these things is limited, but deleting everything and then saving it again seems crude. Is there a good way to only touch the entries that have been deleted?

Finally, to ensure that the user sees his previous tags when he gets to the edit menu, I store the data into $this->request->data:

        $count = 0;
            foreach($profile['Tag'] as $tag):
                $this -> request -> data['Tag']['tag_name'][$count] = $tag['tag_name'];
                $count++;
            endforeach;

Thank you for any remarks :)