/**
 * Searching maximum subarray inside given array
 * 
 * @param array $a Array for sorting
 * @param integer $low left index, 0 by default
 * @param inreger $high right index, count($a) by default
 * @return array $new_arr left index, right index, maximal sum of element
 */
function maximum_subarray(array $a, $low = 0, $high = NULL)
{
    if (count($a) == 0) {
        throw new Exception("Array is empty", 1);
    }
    if ($high === NULL) {
        $high = count($a) - 1;
    }
    if ($low == $high) {
        return array('low' => $low, 'high' => $high, 'sum' => $a[$low]);
    }
    $mid = intval(($low + $high) / 2);
    $left_arr = maximum_subarray($a, $low, $mid);
    $righ_arr = maximum_subarray($a, $mid + 1, $high);
    $cross_arr = max_crossing_subarray($a, $low, $mid, $high);
    if ($left_arr['sum'] >= $righ_arr['sum'] && $left_arr['sum'] >= $cross_arr['sum']) {
        return array('low' => $left_arr['low'], 'high' => $left_arr['high'], 'sum' => $left_arr['sum']);
    } elseif ($righ_arr['sum'] >= $left_arr['sum'] && $righ_arr['sum'] >= $cross_arr['sum']) {
        return array('low' => $righ_arr['low'], 'high' => $righ_arr['high'], 'sum' => $righ_arr['sum']);
    } else {
        return array('low' => $cross_arr['low'], 'high' => $cross_arr['high'], 'sum' => $cross_arr['sum']);
    }
}
<?php

/**
 * Searching maximum subarray inside given array behind linear time
 *
 * @package maximum_subarray
 * @author Andrey Babaev <*****@*****.**>
 */
require_once '../common/functions.php';
ini_set("memory_limit", "512M");
// Prepare test array
$a = array(13, -3, -25, 20, -3, -16, -23, 0, 0, 0, 18, 20, -7, 12, -5, -22, 15, -4, 7);
// Print array before sorting
array_before($a);
// Sort array
$a = maximum_subarray($a);
//Print array after sorting
array_after($a);
measure_exec_time_rand('maximum_subarray', 500000);
measure_exec_time_rand('maximum_subarray', 1000000);
measure_exec_time_rand('maximum_subarray', 1500000);
/**
 * Searching maximum subarray inside given array behind linear time
 * 
 * @param array $a Array for sorting
 * @return array $new_arr left index, right index, maximal sum of element
 */
function maximum_subarray(array $a)
{
    $max_end = 0;
    $max_far = 0;