class CGrain_ArrayTools {
function SortArrayByKey($array,$key,$order,$maintain_index=true,$method="FLOAT") {
// array stable-sort function
if (!is_array($array) || (is_array($array) && count($array)<2)) return $array;
switch($method) {
case "STRING":
$cmpf = create_function(
'$a,$b',
'if($a["'.$key.'"]==$b["'.$key.'"]) return 0; return '.(strtolower($order)=="desc"?"!":"").'strcasecmp($a["'.$key.'"],$b["'.$key.'"]);' // strcasecmp utf incorrect!
);
break;
case "INT":
$cmpf = create_function(
'$a,$b',
'if(intval($a["'.$key.'"])==intval($b["'.$key.'"])) return 0; else return intval($a["'.$key.'"])'.(strtolower($order)=="desc"?"<":">").'intval($b["'.$key.'"])?1:-1;'
);
break;
default: // default is FLOAT
$cmpf = create_function(
'$a,$b',
'if(floatval($a["'.$key.'"])==floatval($b["'.$key.'"])) return 0; else return floatval($a["'.$key.'"])'.(strtolower($order)=="desc"?"<":">").'floatval($b["'.$key.'"])?1:-1;'
);
break;
}
if(!$maintain_index) {
$half = floor(count($array)/2);
$array1 = array_slice($array, 0, $half);
$array2 = array_slice($array, $half);
$array1 = self::SortArrayByKey($array1,$key,$order,$maintain_index,$method);
$array2 = self::SortArrayByKey($array2,$key,$order,$maintain_index,$method);
if ($cmpf($array1[count($array1)-1], $array2[0]) < 1) {
$array = array_merge($array1, $array2);
return $array;
}
$array=array(); $i1=0; $i2=0;
while ($i1 < count($array1) && $i2 < count($array2)) {
if ($cmpf($array1[$i1], $array2[$i2]) < 1) $array[] = $array1[$i1++];
else $array[] = $array2[$i2++];
}
while ($i1 < count($array1)) $array[] = $array1[$i1++];
while ($i2 < count($array2)) $array[] = $array2[$i2++];
return $array;
} else {
$half = floor(count($array)/2);
$array1 = array_slice($array, 0, $half, true);
$array2 = array_slice($array, $half, (count($array)-$half), true);
$array1 = self::SortArrayByKey($array1,$key,$order,$maintain_index,$method);
$array2 = self::SortArrayByKey($array2,$key,$order,$maintain_index,$method);
$keys1 = array_keys($array1);
$keys2 = array_keys($array2);
if ($cmpf($array1[$keys1[count($keys1)-1]], $array2[$keys2[0]]) < 1) {
$array = array_merge($array1, $array2);
return $array;
}
$array=array(); $i1=0; $i2=0;
while ($i1 < count($keys1) && $i2 < count($keys2)) {
if ($cmpf($array1[$keys1[$i1]], $array2[$keys2[$i2]]) < 1) {
$array[$keys1[$i1]] = $array1[$keys1[$i1]]; $i1++;
} else {
$array[$keys2[$i2]] = $array2[$keys2[$i2]]; $i2++;
}
}
while ($i1 < count($keys1)) {
$array[$keys1[$i1]] = $array1[$keys1[$i1]]; $i1++;
}
while ($i2 < count($keys2)) {
$array[$keys2[$i2]] = $array2[$keys2[$i2]]; $i2++;
}
return $array;
}
}
}
|