편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.
최신판 | 당신의 편집 | ||
1번째 줄: | 1번째 줄: | ||
==개요== | ==개요== | ||
;PHP | ;PHP orderBy() | ||
<syntaxhighlight lang='php' line run> | <syntaxhighlight lang='php' line run> | ||
function | function orderBy(&$ary, $clause, $ascending = true) { | ||
$clause = str_ireplace('order by', '', $clause); | |||
$clause = preg_replace('/\s+/', ' ', $clause); | |||
$keys = explode(',', $clause); | |||
$dirMap = array('desc' => 1, 'asc' => -1); | |||
$def = $ascending ? -1 : 1; | |||
$keyAry = array(); | |||
$dirAry = array(); | |||
foreach($keys as $key) { | |||
$key = explode(' ', trim($key)); | |||
$keyAry[] = trim($key[0]); | |||
if(isset($key[1])) { | |||
$dir = strtolower(trim($key[1])); | |||
$dirAry[] = $dirMap[$dir] ? $dirMap[$dir] : $def; | |||
} else { | |||
$dirAry[] = $def; | |||
} | |||
} | |||
$fnBody = ''; | |||
for($i = count($keyAry) - 1; $i >= 0; $i--) { | |||
$k = $keyAry[$i]; | |||
$t = $dirAry[$i]; | |||
$f = -1 * $t; | |||
$aStr = '$a[\''.$k.'\']'; | |||
$bStr = '$b[\''.$k.'\']'; | |||
if(strpos($k, '(') !== false) { | |||
$aStr = '$a->'.$k; | |||
$bStr = '$b->'.$k; | |||
} | |||
if($fnBody == '') { | |||
$fnBody .= "if({$aStr} == {$bStr}) { return 0; }\n"; | |||
$fnBody .= "return ({$aStr} < {$bStr}) ? {$t} : {$f};\n"; | |||
} else { | |||
$fnBody = "if({$aStr} == {$bStr}) {\n" . $fnBody; | |||
$fnBody .= "}\n"; | |||
$fnBody .= "return ({$aStr} < {$bStr}) ? {$t} : {$f};\n"; | |||
} | |||
} | |||
if($fnBody) { | |||
$sortFn = create_function('$a,$b', $fnBody); | |||
usort($ary, $sortFn); | |||
} | |||
} | } | ||
27번째 줄: | 57번째 줄: | ||
['EmployeeID'=>'4', 'Name'=>'너구리', 'BirthDate'=>'2000-01-01'], | ['EmployeeID'=>'4', 'Name'=>'너구리', 'BirthDate'=>'2000-01-01'], | ||
]; | ]; | ||
orderBy($employees, 'BirthDate DESC, Name ASC'); | |||
print_r($employees); | |||
</syntaxhighlight> | </syntaxhighlight> | ||
:→ 생년월일(BirthDate) 역순 정렬, 이름순 정렬 | |||
==같이 보기== | ==같이 보기== |