윈컴이님과 푸시아님, 울라탱님 작성글인데 설명이 좋아서 가져옵니다.
https://xe1.xpressengine.com/qna/21246875
foreach문을 loop문으로 수정하는 방법
foreach문
<!--@foreach($widget_info->member_list as $key => $val)-->
loop문
<li loop="$widget_info->member_list=>$key,$val"><a href="#" onclick="return false;" class="member_{$val->member_srl}">{htmlspecialchars($val->nick_name)}</a></li>
설명(푸시아님 작성)
$widget_info 에 직렬화 된 배열로 값들이 들어가 있는 것입니다. 그중에 member_list 라는 항목에 값들이 들어가 있을 것인데 $key는 그냥 키값을 선언하는거고 $val 은 실제로 배열이 담겨 있는 값이라고 보시면 됩니다. 따라서 루프안에서 $val->member_srl 이라고 하면 $widget_info의member_list 라는 배열 안에 들어있는 member_srl에 해당하는 값을 호출한다는 뜻이 됩니다. $val->nick_name 은 역시 nick_name을 호출한다는 뜻이 되겠죠. htmlspecialchars로 감싸 준 것은 태그값 같은 것이 변형되지 않도록 그대로 텍스트로 표현되도록 string을 처리해 준겁니다.
자세한설명(울라탱님 작성)
위에 사용중인 foreach($widget_info->member_list as $key => $val) 를 이해 하시려면...
for 문과 배열에 대해서 먼저 아셔야 합니다...
for 문은 반복문(for, foreach, while, do while) 중에 하나입니다.
어떤 일을 반복적으로 할 때 사용 하죠..
화면에 1~10 까지 출력을 하고자 할 때
1
2
3
4
|
for ( $i =1; $i <=10; $i ++){ echo $i .' '; } |
이렇게 하면 됩니다.
for(초기값; 조건식; 증가값){}
"$i 가 10 보다 작거나 같을 동안 +1 씩 증가 하면서 돌아라." 라고 이해 하시면 쉬울거 같네요.
$i++ = $i+1
배열
하나의 변수에 여러개의 값을 담고자 할 때 사용 합니다.
인덱스가 숫자형인 배열과 인덱스가 문자형인 연상(?, 연관?)배열, 관계형(?) 배열이 있습니다. (위의 $widget_info 배열은 관계형입니다.)
$home = array('도우너', '둘리', '또치', '마이콜', '고길동');
$home 라는 변수의 형태는 array 이고, 값은 5개가 들어가 있습니다. (값의 형태는 뭐든 상관 없습니다. 문자, 숫자, object)
배열에는 인덱스라는게 있는데 0 부터 시작하며, 방번호라 생각 하시면 쉽습니다.
- $home 이라는 집에는 방이 5개가 있는데 0번방에는 '도우너'가 삽니다.
- 방 5개가 존재하는데 방번호는 1~5번이 아닌, 0~4번이 됩니다.
$home 라는 집에 누가 사는지 전체적으로 보려면
1
2
3
4
5
|
$home = array ( '도우너' , '둘리' , '또치' , '마이콜' , '고길동' ); for ( $i =0; count ( $home ); $i ++){ echo $home [ $i ].' '; } |
이렇게 하면 누가 사는지 다 볼수 있습니다.
이게 '숫자 인덱스 배열'입니다.
위의 '숫자 인덱스 배열'을 '문자 인덱스 배열'로 바꾸면 아래와 같습니다.
$home = array('room1'=>'도우너', 'room2'=>'둘리', 'room3'=>'또치', 'room4'=>'마이콜', 'room5'=>'고길동');
이 배열을 for 문을 이용하여 출력 하려면
1
2
3
4
|
for ( $i =1; count ( $home ); $i ++){ echo $home [ 'room' . $i ].' '; } |
이렇게 하면 됩니다.
인덱스를 다 뽑아 보면, room1, room2, room3, room4, room5 가 되는데, 반복적으로 보이는게 'room'이라는 문자죠. 여기에 1~5가 붙는 구조
이렇게 연속적인 패턴인 경우에 for 문은 유용 합니다.
아래에 foreach 설명을 다시 하겠지만, 맛뵈기로 위의 for 문을 변환 시키게 되면
1
2
3
4
|
foreach ( $home as $key => $val ){ echo $home [ $key ].' '; } |
이렇게 됩니다.
출력 결과는 위의 for 문과 동일 합니다.
여기 까지가 반복문for 를 이용한 배열 출력 방법 입니다.
foreach
for 문은 연속 숫자 패턴이라면 배열이 아니더라도 어디서든 써먹을수 있습니다. 하지만 foreach 는 배열 형태만 사용 가능 합니다.
for문과 큰 차이점이라고 하면, '조건식이 없다'는 겁니다. - for(초기값; 조건식; 증가값){}
배열 출력을 위해서는 배열의 방 숫자 만큼 돌아야 하기 때문에 count(배열) 로 방 숫자를 알아 내고, 그만큼만 돌게 되죠.
그런데 foreach 에서는 굳이 방 갯수를 알지 않아도 됩니다. 알아서 배열 방 갯수만큼만 돕니다.
더욱이 좋은점은, 숫자 인덱스가 아니더라도 각 방에 접근이 가능 하다는 거죠.
foreach(배열 as 키값 => 값){}
일반 for 문과 다른점이라고 하면, '키값'과 ''값' 입니다. - 배열[인덱스] == 배열[키값]
배열에서 값을 출력 하려면, 배열[인덱스] 가 됩니다. 그런데 foreach 는 두가지를 지원 합니다.
일반적인 배열 접근 방식인 '배열[인덱스]' 방법과 '값' 입니다.
echo 배열[키값]; 하게 되면 배열의 값이 나오게 되죠. 그런데 '값' 은 말 그대로 값이 바로 들어가 있습니다.
echo 배열[키값] == echo 값 이 둘은 동일한 내용을 출력 하게 되죠.
이해 되시죠? -ㅇ-ㅋ
앞서 맛뵈기로 보셨던 foreach 를 변환 하면
1
2
3
4
|
foreach ( $home as $key => $val ){ echo $val .' '; } |
이렇게 됩니다. 당연히 결과는 같죠.
주로 이런데 사용 합니다. - 인덱스 패턴이 불규칙 할 때, 연관배열 일때
$home = array('room1'=>'도우너', 'room2'=>'둘리', 'room3'=>'또치', 'room4'=>'마이콜', 'room5'=>'고길동');
$home = array('room1'=>'도우너', 'room3'=>'둘리', 'room13'=>'또치', 'room41'=>'마이콜', 'room59'=>'고길동');
두 배열의 차이점은 인덱스 값이 다르다는 건데, 위에껀 순차적 패턴이고, 밑에껀 불규칙 패턴이죠.
불규칙 패턴일 경우 for 문은 불가능 하나, foreach 는 가능 합니다. - 잔머리 굴리면 안되는거 없긴 해요 -_-......
관계형 배열 - 배열이라기 보다는 object 형태 입니다. 단지 모양이 배열 모양일 뿐...
$array[0] = '123' 혹은 $array['idx'] = '123' 의 일반 배열이 아닌 $array->idx = '123 이라는 형태가 관계형 배열입니다.
물어 보셨던 foreach 문장의 $widget_info 배열이 바로 관계형 배열 입니다.
$widget_info 라는 배열의 인덱스가 member_list 인 방은 $widget_info->member_list 로 접근 합니다.
xe 에서 사용하는 배열은 대부분 관계형 배열이라 보시면 됩니다.
- foreach 가 for 문보다 많은건 foreach 가 쓰기 편해서구요.. ㅋㅋ
질문 내용의 $widget_info 배열을 예상 해서 적어 보면
$widget_info->member_list[0]->member_srl = ??
$widget_info->member_list[0]->nick_name = ??
이런 형태 일껍니다.
member_list 는 디비 목록 그대로 가져 왔을 테니 숫자형 배열 일꺼구요.
member_srl, nick_name 이외에도 회원정보 관련된 모든 정보가 아마 다 들어 있을 겁니다.
1
2
3
4
|
$member_list [0] = stdClass Object ( [member_srl] => [nick_name] => ) |
이건 member_list 배열의 0 번 방을 print_r 로 출력 하면 이렇게 보입니다.
foreach($widget_info->member_list as $key => $val)
$widget_info->member_list : 배열
$key = 인덱스 키값
$val = $widget_info->member_list[$key] 의 값
다 차원 배열도 존재 하니 $val 로 배열이죠. $val->member_srl, $val->nick_name
다차원 배열은, 배열안에 배열이 있다고 보시면 됩니다.
배열 = 일반 1층 짜리 건물
다차원 배열 = 아파트
for문 : loop="$i=0; $i < 10; $i++"
while문 : loop="$page_no=$page_navigation->getNextPage()"