You would use an array, holding all the possible choices, in order to make sure that the submitted value is a permitted choice. However, you wouldn't define the array in the validation logic. You would define/retrieve it at a common point in the form and the form processing code (such as in a configuration file or a database table) and you would also use it to dynamically build the list of <option ></option> choices for the form, so that both the form and the form processing code use the exact same array of data.
After the form has been submitted, a <select> field will be set, so, don't use isset() in your code. If a <select> field isn't set, it either means that you have a mistake in your coding somewhere or someone is submitting their own data to your form processing code. In either case, you would want to see/log a php error about a non-existent field in the submitted form data.
The value will never be the literal string 'NULL' (what your code is testing for now), nor will it ever normally be a php NULL value, so, there's no good reason to test against a null value. If the 1st/default option choice is actually a prompt to make a selection and its value in an empty string - '', you would test if the submitted value is an empty string when the form field is 'required' and setup an appropriate error message telling the visitor that they must make a selection.
If the submitted value isn't an empty string, you would test if it is in the array of possible choices, using in_array(), and setup an appropriate message that the value isn't a valid choice. You would only see this error message when testing and only if you have a mistake in your form or in your form processing code. An actual visitor to your site will never see this error.
I also recommend that you use an array to hold the valuation error messages, with the array element index name being the form field name. This will let you test at any point if there is a validation error for any field (some fields might require multiple validation steps and you would only run successive steps if there are no errors for that field from an earlier step) and will let you output any error messages next to the form field they correspond to, by accessing errors by their field name.