That is because your query is not eliminating posts that don’t have a value
$query_array['meta_value'] = '';
$query_array['meta_compare'] = '!=';
Other than this I don’t see an issue unless ACF is unable to figure out the post ID. Are you using the global $post variable for your loop? If not then you need to supply the correct post ID to get the value from in the second argument to the_field() or get_field().