윈컴이님과 푸시아님, 울라탱님 작성글인데 설명이 좋아서 가져옵니다.

https://xe1.xpressengine.com/qna/21246875

 

foreach문을 loop문으로 수정하는 방법

foreach문

<!--@foreach($widget_info->member_list as $key => $val)-->

<li><a href="#" onclick="return false;" class="member_{$val->member_srl}">{htmlspecialchars($val->nick_name)}</a></li>
<!--@end-->

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층 짜리 건물

다차원 배열 = 아파트

 

 

이온디

profile
이온디는 라이믹스를 비롯한 다양한 CMS의 시드뱅크를 꿈꿉니다. 여러분들이 사랑하는 웹소스를 언제든지 사용할 수 있게 하기 위해 이온디는 매일 소스코드를 유지보수하고 있으며, 언제든지 다운로드할 수 있는 소스마켓을 운영하고 있습니다.

#XE마켓 - 이온디스토어
https://eond.com/xemarket/

# XE/라이믹스 단톡방을 운영 중입니다. (비번: 2022)
https://open.kakao.com/o/giaKKnl

# XE/라이믹스 생활코딩 모듈 강좌입니다.
https://opentutorials.org/module/3774
  • profile
    거의 쓸 일은 없지만 for문과 while문도 템플릿 문법화가 가능하더라구요.

    for문 : loop="$i=0; $i < 10; $i++"
    while문 : loop="$page_no=$page_navigation->getNextPage()"
  • profile
    XE 템플릿의 loop 문법은 조금만 잘못 건드리면 왕창 깨져버리는데다
    직관적이지 않기 때문에 가능하면 for, foreach, while을 그대로 쓰는 것이 좋습니다.