편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.
최신판 | 당신의 편집 | ||
1번째 줄: | 1번째 줄: | ||
;PHP orderBy() | |||
== | ==orderBy.php 작성== | ||
<source lang='php'> | |||
; | <?php | ||
; | 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); | |||
} | |||
} | } | ||
</source> | |||
==orderBy_test.php 작성== | |||
<source lang='php'> | |||
<?php | |||
include 'orderBy.php'; | |||
$employees = array( | |||
array('EmployeeID'=>'1', 'Name'=>'한놈', 'BirthDate'=>'1999-01-01'), | |||
array('EmployeeID'=>'2', 'Name'=>'두시기', 'BirthDate'=>'2000-01-01'), | |||
array('EmployeeID'=>'3', 'Name'=>'석삼', 'BirthDate'=>'1999-01-01'), | |||
array('EmployeeID'=>'4', 'Name'=>'너구리', 'BirthDate'=>'2000-01-01') | |||
); | |||
orderBy($employees, 'BirthDate DESC, Name ASC'); | |||
print_r($employees); | |||
</source> | |||
:→ 생년월일(BirthDate) 역순 정렬, 이름순 정렬 | |||
==테스트== | |||
<source lang='cli'> | |||
[root@zetawiki ~]# php orderBy_test.php | |||
Array | |||
( | |||
[0] => Array | |||
( | |||
[EmployeeID] => 4 | |||
[Name] => 너구리 | |||
[BirthDate] => 2000-01-01 | |||
) | |||
[1] => Array | |||
( | |||
[EmployeeID] => 2 | |||
[Name] => 두시기 | |||
[BirthDate] => 2000-01-01 | |||
) | |||
[2] => Array | |||
( | |||
[EmployeeID] => 3 | |||
[Name] => 석삼 | |||
[BirthDate] => 1999-01-01 | |||
) | |||
[3] => Array | |||
( | |||
[EmployeeID] => 1 | |||
[Name] => 한놈 | |||
[BirthDate] => 1999-01-01 | |||
) | |||
) | |||
</source> | |||
</ | |||
==같이 보기== | ==같이 보기== | ||
* [[PHPLinq 2차원 배열 employees 예제]] | *[[PHPLinq 2차원 배열 employees 예제]] | ||
* [[PHPLinq 2차원 배열 employees 예제 2 | *[[PHPLinq 2차원 배열 employees 예제 2]] | ||
==참고== | ==참고 자료== | ||
*http://php.net/manual/en/function.usort.php | *http://php.net/manual/en/function.usort.php | ||
[[분류: PHP | [[분류: PHP]] |