Here a good example my wordpress meta box foreach.

foreach ($meta_box['fields'] as $field) {

        $old = get_post_meta($post_id, $field['id'], true);
        $new = $_POST[$field['id']];

         if (isset($_POST[$field['id']])) {
            update_post_meta($post_id, $field['id'], $new);

        } elseif ('' == $new && $old) {
            delete_post_meta($post_id, $field['id'], $old);
        }
}

If here have empty input I'll got Notice: Undefined index: at $new How you can fix that one?

Change $new = $_POST[$field['id']]; to:

$new = ( IsSet ( $_POST[$field['id']] ) === true ? $_POST[$field['id']] : 'some default value' );

You have to test when the $_Publish[$area['id']] is placed before calling it, otherwise you'll trigger that error. You are checking for this around the next line, so just move up.

foreach($meta_box['fields'] as $field){
    if(isset($_POST[$field['id']])){
        // POST field sent - update
        $new = $_POST[$field['id']];
        update_post_meta($post_id, $field['id'], $new);

    } else {
        // POST field not sent - delete
        $old = get_post_meta($post_id, $field['id'], true);
        delete_post_meta($post_id, $field['id'], $old);
    }
}

Before init of $new you should check whether it is available:

if(isset($_POST[$field['id']])) {
    $new = $_POST[$field['id']];
}
else {
    $new = "default";
}

Otherwise is available you place it towards the default value.