PHP 다중정렬 sortOrderBy()

Jmnote (토론 | 기여)님의 2015년 6월 23일 (화) 17:42 판 (새 문서: ;PHP orderBy() ==orderBy.php 작성== <source lang='php'> <?php function orderBy(&$ary, $clause, $ascending = true) { $clause = str_ireplace('order by', '', $clause); $clause = p...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)
PHP orderBy()

1 orderBy.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);        
	} 
}

2 test.php 작성

3 테스트

4 같이 보기

5 참고 자료

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}