You've got no way of telling which checkboxes go with which text fields; because if there are any checkboxes that are not checked, then they won't be submitted, and therefore won't be in the $_POST array.
First: improve the names of your form fields so that the array you get isn't all over the place the way it is now:
<input type=\"text\" name=\"post[{$get_posts->post_id}][title]\" value=\"{$get_posts->title}\" class=\"text_field\" title=\"{$get_posts->title}\" /></td>
<td class=\"$row_color\"><input type=\"text\" name=\"post[{$get_posts->post_id}][img]\" value=\"{$get_posts->img}\" class=\"text_field\" title=\"{$get_posts->img}\" /></td>
<td class=\"$row_color\"><input name=\"post[{$get_posts->post_id}][visible]\" type=\"checkbox\" value=\"{$get_posts->post_id}\" $is_vis /></td> type
(You won't need the hidden post_id field any more, which is a good thing because where it is now is invalid.)
Now you can write something like
foreach($_POST['post'] as $post_id=>$post)
{
$title = $post['title'];
$vis = isset($post['visible']) ? 1 : 0;
// ...
}
Second: Search for the phrase "SQL injection" and fix your query construction - never blindly put user input into a database query.
Third: You could give the <table> a class and then use ".classname tr td {...}" in CSS to style its cells - instead of styling every cell individually.