"PHP 다중정렬 sortOrderBy()"의 두 판 사이의 차이

잔글 (봇: 자동으로 텍스트 교체 (-</source> +</syntaxhighlight>, -<source +<syntaxhighlight ))
2번째 줄: 2번째 줄:
;PHP orderBy()
;PHP orderBy()


<source lang='php' run>
<syntaxhighlight lang='php' run>
function orderBy(&$ary, $clause, $ascending = true) {  
function orderBy(&$ary, $clause, $ascending = true) {  
$clause = str_ireplace('order by', '', $clause);  
$clause = str_ireplace('order by', '', $clause);  
59번째 줄: 59번째 줄:
orderBy($employees, 'BirthDate DESC, Name ASC');
orderBy($employees, 'BirthDate DESC, Name ASC');
print_r($employees);
print_r($employees);
</source>
</syntaxhighlight>
:→ 생년월일(BirthDate) 역순 정렬, 이름순 정렬
:→ 생년월일(BirthDate) 역순 정렬, 이름순 정렬



2020년 11월 2일 (월) 02:57 판

1 개요

PHP orderBy()
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);        
	} 
}

$employees = [
	['EmployeeID'=>'1', 'Name'=>'한놈', 'BirthDate'=>'1999-01-01'],
	['EmployeeID'=>'2', 'Name'=>'두시기', 'BirthDate'=>'2000-01-01'],
	['EmployeeID'=>'3', 'Name'=>'석삼', 'BirthDate'=>'1999-01-01'],
	['EmployeeID'=>'4', 'Name'=>'너구리', 'BirthDate'=>'2000-01-01'],
];
orderBy($employees, 'BirthDate DESC, Name ASC');
print_r($employees);
→ 생년월일(BirthDate) 역순 정렬, 이름순 정렬

2 같이 보기

3 참고

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