too long

I wasn't entirely sure how to search for this question, so if it has been asked before please send me in the right direction.

I have a validation function with an array. Inside my array I have set up errors to be displayed if one of the form fields doesn't validate. If the user fills a field out wrong, they should get an error of which field was wrong and the form should be still present. However, they get a blank page with only the generic error (the one I echo when I called the function) and not the field-specific error. Can someone please tell me where I went wrong?

$output_form = 1; //control if form displays - yes
$error_text = ''; 

//declare form elements (empty first load)
$fname = '';
$valid_fname = 0;
$fname_regex = '/^([A-Z]|[a-z]){2,15}$/';
$fname_error_message = 'First name must be 2-15 alphabetic characters only.<br>';

$lname = '';
$valid_lname = 0;
$lname_regex = '/^([A-Z]|[a-z]){2,15}$/';
$lname_error_message = 'Last name must be 2-15 alphabetic characters only.<br>';

$phone = '';
$valid_phone = 0;
$phone_regex = '/^\(\d{3}\)\d{3}-\d{4}$/';
$phone_error_message = 'Phone number must be in (xxx)xxx-xxxx format.<br>';


$city = '';
$valid_city = 0;
$city_regex = '/^([A-Z]|[a-z]){2,15}$/';
$city_error_message = 'City must be 2-15 alphabetic characters only.<br>';

$state = '';
$valid_state = 0;
$state_regex = '/^([A-Z]|[a-z]){2}$/';
$state_error_message = 'State must be 2 alphabetic characters only.<br>';

//data posted
if (isset($_POST['submit'])) {

    if ($debug) {
        echo "<pre>";
        print_r($_POST);
        echo "</pre>";
    }//end debug

    $fname = trim($_POST['fname']);
    $lname = trim($_POST['lname']);
    $phone = trim($_POST['phone']);
    $city = trim($_POST['city']);
    $state = trim($_POST['state']);

    $phone_replace = preg_replace('/[\(\)\-\s]/', '', $phone);

    function validate_form($fields, &$errors = []) {
        $errors = [];
        foreach ($fields as $name => $field) {
            if (!preg_match ($field['regex'], $field['value'])) {
                $errors[$name] = $field['error'];
                $output_form = 1;
            }
        }
        return empty($errors); //returns true/false
    }

    $fields = [
        'fname' => ['regex' => $fname_regex, 'value' => $fname, 'error' => $fname_error_message],
        'lname' => ['regex' => $lname_regex, 'value' => $lname, 'error' => $lname_error_message],
        'phone' => ['regex' => $phone_regex, 'value' => $phone, 'error' => $fname_error_message],
        'city' => ['regex' => $city_regex, 'value' => $city, 'error' => $city_error_message],
        'state' => ['regex' => $state_regex, 'value' => $state, 'error' => $state_error_message],
    ];
    $errors = [];
    if (!validate_form($fields, $errors)) {
        echo "<p>One of your fields is invalid. Please check and re-submit.</p>";
        $output_form = 1;
        return (false);
    }
    else {
        $output_form = 0;
    }
foreach($errors as $error) echo "<p>$error</p>";

Actually outputting stuff usually helps ;)