$wpdb->get_results();
has a second parameter for the return format:
/**
* Retrieve an entire SQL result set from the database (i.e., many rows)
*
* Executes a SQL query and returns the entire SQL result.
*
* @since 0.71
*
* @param string $query SQL query.
* @param string $output Optional.
* Any of ARRAY_A | ARRAY_N | OBJECT | OBJECT_K constants.
* With one of the first three, return an array of rows indexed from 0 by SQL
* result row number.
* Each row is an associative array (column => value, ...), a numerically
* indexed array (0 => value, ...), or an object. ( ->column = value ),
* respectively.
* With OBJECT_K, return an associative array of row objects keyed by the
* value of each row's first column's value. Duplicate keys are discarded.
* @return mixed Database query results
*/
function get_results( $query = null, $output = OBJECT ) {
So this will return an array:
$result = $wpdb->get_results( $sql, ARRAY_A );