TIP게시판

제목 주소 세그먼트 -> 배열변환 함수
글쓴이 변종원(웅파) 작성시각 2009/10/28 13:21:33
댓글 : 4 추천 : 0 스크랩 : 0 조회수 : 27603   RSS
주소가  http://hbuilder.com/first/product0/third/lists/page/1/?q=nos&nn=3 일 경우(쿼리스트링이 있을 경우)

Array ( [0] => first [1] => product0 [2] => third [3] => lists [4] => page [5] => 1 [6] => q [7] => nos [8] => nn [9] => 3 )
형태로 반환을 해줍니다.

일반적인 형태의 주소뿐만 아니라 쿼리스트링까지 들어있는 경우도 처리가 가능하도록 했습니다.

function segment_explode($seg) { //세크먼트 앞뒤 '/' 제거후 uri를 배열로 반환
	$len = strlen($seg);
	if(substr($seg, 0, 1) == '/') {
		$seg = substr($seg, 1, $len);
	}
	$len = strlen($seg);
	if(substr($seg, -1) == '/') {
		$seg = substr($seg, 0, $len-1);
	}
	$seg_exp1 = explode("/", $seg);

        //쿼리스트링을 $seg_ext와 동일한 형태의 배열로 반환
        if($_SERVER["QUERY_STRING"]){
            $s_arr=array();
            $strings = explode("&", $_SERVER["QUERY_STRING"]);
            foreach ($strings as $strs) {
                $a_arr = explode("=", $strs);
                foreach ($a_arr as $atrs) {
                    array_push($s_arr, $atrs);
                }
            }
            //맨끝 쿼리스트링 제거
            array_pop($seg_exp1);
            //쿼리스트링을 제거한 배열과 쿼리스트링을 배열화한 것을 합쳐서 반환
            $seg_exp = array_merge($seg_exp1, $s_arr);
        } else {
            $seg_exp = $seg_exp1;
        }
	return $seg_exp;
}

참고로 기존 주소와 쿼리스트링의 복합적인 형태를 사용하시려면 config.php 파일에서

$config['uri_protocol']	= "AUTO"; //기본

$config['uri_protocol']	= "REQUEST_URI"; //쿼리스트링과 복합사용
uri_protocol을 AUTO 에서 REQUEST_URI 로 바꿔주시면 됩니다.


활용편

위와 같이 주소를 배열로 바꾸고 나서 쿼리스트링 또는 주소쌍에 대응하는 값을 가져오고자 할 경우
(page/1 또는 ?q=nos) 다음 함수를 호출하여 사용하면 됩니다.

echo url_explode($seg_ext, 'q');
결과는 nos 를 화면에 뿌려줍니다.

/**
* url중 키값을 구분하여 값을 가져오도록
* author 우기파파
* @param Array $url : segment_explode 한 url값
* @param String $key : 가져오려는 값의 key
* @return String $url[$k] : 리턴값
*/
function url_explode($url,$key){
	for($i=0; count($url)>$i; $i++ ){
		if($url[$i] ==$key){
			$k = $i+1;
			return $url[$k];
		}
	}
}


 다음글 공개된 포럼 소스를 lighttpd에 설치할 때 .ht... (5)
 이전글 오류 몇가지 (3)

댓글

ci세상 / 2009/10/28 15:01:31 / 추천 0
쿼리스트링 추구하시는 분들께는 좋겠네요^^ 세그먼트만 있으면 segment_array() 이걸로 한방에 배열처리가 가능하지만요 ~~

좋은 팁 ~~ 감사합니다.
SADBLUE / 2009/10/28 15:34:28 / 추천 0
음..왜 저는 explode 생각을 못했을 까요-_-;
재귀 호출 하면서 배열 변수에 push하는 함수를 맹가서 쓰고 있는데.;;
갑자기 바꾸고 싶어지네요.-ㅅ-;

변종원(웅파) / 2009/10/29 15:49:20 / 추천 0
        function segment_explode($seg) { //세크먼트 앞뒤 '/' 제거후 uri를 배열로 반환
		$len = strlen($seg);
		if(substr($seg, 0, 1) == '/') {
			$seg = substr($seg, 1, $len);
		}
		$len = strlen($seg);
		if(substr($seg, -1) == '/') {
			$seg = substr($seg, 0, $len-1);
		}
		$seg_exp1 = explode("/", $seg);

        //쿼리스트링을 key(query_string)로 하여 배열로 반환
        if($_SERVER["QUERY_STRING"]){
            $result=array();
            $strings = explode("&", $_SERVER["QUERY_STRING"]);
            foreach ($strings as $strs) {
                $a_arr = explode("=", $strs);
                $result = array_merge($result, array($a_arr[0]=>$a_arr[1]));
            }
            $d_arr = array('query_string'=>$result);
            //맨끝 쿼리스트링 제거
            array_pop($seg_exp1);
            //쿼리스트링을 제거한 배열과 쿼리스트링을 배열화한 것을 합쳐서 반환
            $seg_exp = array_merge($seg_exp1, $d_arr);
        } else {
            $seg_exp = $seg_exp1;
        }
        return $seg_exp;
	}
주소 http://hbuilder.com/product/product2/?a=1&b=2&c=3 를

Array (
[0] => product
[1] => product2
[query_string] => Array ( [a] => 1 [b] => 2 [c] => 3 )
)
형태로 반환.

쿼리스트링과 기존 주소를 구분할 필요가 있어서 수정했습니다.
이 함수를 쓰게 되면 ci주소 형식과 쿼리스트링을 구분하여 값을 가져다 쓸 수 있게되어
검색이나 페이징 등에서 자유롭게 주소를 활용할 수 있습니다.
winduwho / 2009/11/21 12:45:51 / 추천 0


만약 배열에 담는게 아니고
하위코드에서 그 변수를 직접 쓸거라면
? 이후의 쿼리스트링을 아래와 같이 해도..

parse_str($qs);
extract($qs);