What is the A* algorithm and how is it used in PHP for pathfinding?

The A* algorithm is a popular pathfinding algorithm used to find the shortest path between two points in a graph. It uses a heuristic function to estimate the cost of reaching the goal from each node, allowing it to efficiently search through the graph and find the optimal path.

```php
<?php

function aStar($start, $goal, $graph) {
    $openSet = [$start];
    $cameFrom = [];
    $gScore = [$start => 0];
    $fScore = [$start => heuristic($start, $goal)];

    while (!empty($openSet)) {
        $current = array_keys($openSet, min($fScore))[0];

        if ($current == $goal) {
            return reconstructPath($cameFrom, $current);
        }

        unset($openSet[array_search($current, $openSet)]);

        foreach ($graph[$current] as $neighbor => $cost) {
            $tentativeGScore = $gScore[$current] + $cost;

            if (!isset($gScore[$neighbor]) || $tentativeGScore < $gScore[$neighbor]) {
                $cameFrom[$neighbor] = $current;
                $gScore[$neighbor] = $tentativeGScore;
                $fScore[$neighbor] = $gScore[$neighbor] + heuristic($neighbor, $goal);

                if (!in_array($neighbor, $openSet)) {
                    $openSet[] = $neighbor;
                }
            }
        }
    }

    return null;
}

function heuristic($node, $goal) {
    // Calculate heuristic function (e.g. Euclidean distance)
}

function reconstructPath($cameFrom, $current) {
    $totalPath = [$current];

    while (isset($cameFrom[$current])) {
        $current = $cameFrom[$current];
        array_unshift($totalPath, $current);
    }

    return $totalPath;
}

// Example usage
$start = 'A';
$goal = 'F';
$graph = [
    'A' => ['B' => 1, 'C' => 3],
    'B' => ['A' => 1, 'D' => 2],
    'C' => ['A' => 3, 'D' => 1, 'E' => 5],
    'D' => ['B' => 2, 'C' => 1, '