The quick-service restaurant industry continues to evolve, and that’s no more evident than in the QSR 50. Last year, Panera Bread inched closer to the top 10, while fellow fast casual Chipotle padded its sales by nearly half a billion dollars to climb to spot No. 15. Chick-fil-A put more space between it and competitor KFC, while Starbucks used a product diversification strategy to gain ground on No. 2 brand Subway. Meanwhile, McAlister’s Deli entered the top 50 for the first time, Zaxby’s crossed the billion-dollar threshold, and McDonald’s struggled to find consistency as the growing demand for premium products threatened to steal market share. Dig deep into the data driving the quick-service and fast-casual restaurant industries with this year’s QSR 50.
Click column headers to sort
array(
'sort_dir' => 'asc',
'indicator' => '',
'label' => 'Rank',
),
'chain' => array(
'sort_dir' => 'asc',
'indicator' => '',
'label' => 'Company/Chain Name',
),
'2013_sales' => array(
'sort_dir' => 'asc',
'indicator' => '',
'label' => '2013 U.S. Systemwide Sales (Millions)',
),
'2013_avg_sales' => array(
'sort_dir' => 'asc',
'indicator' => '',
'label' => '2013 U.S. Average Sales per Unit (thousands)',
),
'2013_franchise_units' => array(
'sort_dir' => 'asc',
'indicator' => '',
'label' => 'Number of Franchised Units in 2013',
),
'2013_company_units' => array(
'sort_dir' => 'asc',
'indicator' => '',
'label' => 'Number of Company Units in 2013',
),
'2013_total_units' => array(
'sort_dir' => 'asc',
'indicator' => '',
'label' => 'Total Units in 2013',
),
'2012_unit_change' => array(
'sort_dir' => 'asc',
'indicator' => '',
'label' => 'Total Change in Units from 2012',
),
);
if ( isset( $_GET['sort'] ) && in_array( $_GET['sort'], array_keys( $headers ) ) ) {
$sort_field = $_GET['sort'];
} else {
$sort_field = 'rank';
}
if ( isset( $_GET['dir'] ) && in_array( $_GET['dir'], array( 'asc', 'desc' ) ) ) {
$sort_dir = $_GET['dir'];
} else {
$sort_dir = 'asc';
}
$opposite_dir = ( $sort_dir == 'asc' ) ? 'desc' : 'asc';
$headers[$sort_field]['sort_dir'] = $opposite_dir;
$headers[$sort_field]['indicator'] = theme_tablesort_indicator( array( 'style' => $sort_dir ) );
$header_cols = array();
foreach ( $headers as $field => $field_data ) {
$header_cols[] = array(
'data' => l( $field_data['label'], $_GET['q'], array( 'query' => array( 'sort' => $field, 'dir' => $field_data['sort_dir'] ) ) ) . $field_data['indicator'],
'class' => 'header',
);
}
$table_rows = array();
$table_rows[] = $header_cols;
/* begin of function area */
$sorted_data = array();
$values = array();
foreach ( $the_data as $id => $value ) {
$values[$id] = $value->$sort_field;
}
if ( $sort_dir == 'asc' ) {
asort( $values );
} else {
arsort( $values );
}
foreach ( $values as $key => $value ) {
$data_cells = array();
foreach ( $headers as $field => $field_data ) {
$cell_data = $the_data[$key]->$field;
if ( $field == '2013_sales' || $field == '2013_avg_sales' ) {
$cell_data = '$' . number_format( $cell_data, 1 );
}
elseif ( preg_match( '/_unit/', $field ) ) {
$cell_data = number_format( $cell_data );
}
elseif ( $field == 'chain' && property_exists( $the_data[$key], 'chain_super' ) ) {
$cell_data .= ' ' . $the_data[$key]->chain_super . '';
}
elseif ( $field == 'rank' && $cell_data == 12 ) {
$cell_data .= ' (tie)';
}
$classes = $field;
if ( $field == $sort_field ) {
$classes .= ' sorted';
}
$data_cells[] = array( 'data' => $cell_data, 'class' => $classes );
}
$table_rows[] = $data_cells;
}
/* end of functional area */
print theme( 'table', array( 'header' => array(), 'rows' => $table_rows, 'attributes' => array( 'id' => 'datatable' ) ) );
?>