<textarea value="<?= $message ?>" name="message" tabindex="4" placeholder="No of adults, No of children and Date for ride" >
<textarea name="message" tabindex="4" placeholder="No of adults, No of children and Date for ride" ><?= $message ?></textarea>
<button name="submit" type="submit" id="contact-submit" data-submit="...Sending">Submit</button>
is not a proper submit button... it should be
<input name="submit" type="submit" value="Submit">
Avoid using name="name" name conventions, use something like name="group_name"
<form id="contact" action="<?= htmlspecialchars($_SERVER["PHP_SELF"]) ?>" method="post">
has no enctype="multipart/form-data" setting and I assume that you are submitting to the same page when you use <?= htmlspecialchars($_SERVER["PHP_SELF"]) ?> so using basename( $_SERVER["PHP_SELF"]); will just allow the last part of the URL
If you use a HTML5 web form and its designated fields, you can unload some of the checks by using appropriate attributes in the tag, for example <input name="email" type="email" value="" required> will expect an email address to be entered and the field to be filled not empty.
Using HTML5 code on older browsers means that they degrade to plain text inputs, so your script needs to issue a web page with support for browsers that do not support HTML5 inputs, there is still some issue over what browsers now support as the full set of HTML5 fields were not supported by all browsers, this does not mean you can't use them, it means that currently you would have to build in support from existing libraries / frameworks to add in the feature you want, like a date picker if the browser does not support the current HTML% date picker field.
You only use filter_var once when you should be using it more and also your using the input arrays directly when you should be filtering in to a safe array that you then use because you know that the data in those fields is safe to use.
You are performing some routines that are not needed as well as repeating tests over in different methods, you can use empty() to test for an empty variable over having to construct a comparison like $mystring == "" a simpler empty($mystring) method exists.
Your web page for errors is not very forgiving, you should return and display any fields that you have already got data inputs to, by adding the field name in the value field with  you can have that field contents displayed in that field so that you are not presenting an empty form because of one error in a field...