Chillax in dev

[PHP] 다중 배열 foreach 순회하기 본문

PHP & MySQL

[PHP] 다중 배열 foreach 순회하기

Seong Story 2022. 10. 3. 21:00
728x90

[PHP]  다중 배열  foreach 순회하기

- 개발 업무를 하다 보면 결국 마지막에 하는 일은  json, xml을 파싱 하거나, 복잡한 배열을 주고받으며 내가 원하는 형태로 가공하는 일을 합니다.

특히 API를 활용하는 개발을 진행할 때 수신 측에 조건을 모두 충족하는 Request를 만들어 보내야 하는 경우가 많습니다.

즉 배열의 순회를 물 흐르듯 해야 하지요. 이것이 기초이면서 생각보다 Trying to get property of non-object , illegal off set type ...  같은 에러를 반환할 때가 많습니다.

 

실무 중 내가 활용한 PHP  foreach  사용 예시들을 계속 추가해볼까 합니다. 

 

1. foreach 사용법

- PHP에서 foreach를 쓰면 배열의 원소, 객체의 프러퍼티 수만큼 반복하여 순회한다.

for, while Loop를 사용하는 것보다 라인수 감소, 깔끔하게 코딩이 가능합니다. 

또한 다차원 배열의 순회, 중첩 가능, 배열에 키(key)와 원소(value)를 쉽게 분리하여 사용 가능합니다.

 

쉽게 말하면

$a = array(1,2,3) 

$b= array( "one" => 1, "two" => 2, "three" => 3, "seven" => 7 );

이런 배열, 객체를 반복해서 쓰고 싶을 때 사용하면 됩니다.

 

기본적인 사용 예시 

// 방법 1 : 배열의 원소(값)만 얻습니다.
 foreach (array_expression as value) {
    statement;
 }
 
 // 방법 1 예시 
 <?php
 $arr = array(1,2,3,4,5);
 foreach($arr as $row){
     echo $row;
  }
?>

// 결과 : 12345 

 // 방법 2 : 배열의 키(key) , 원소(value) 모두 얻습니다.
 foreach (array_expression as key => value) {
    statement;
 }
 
 //방법 2 예시
 
<?php 
$arr = array(
    "A" => "apple",
    "B" => "bottle"
);
	 
foreach ($arr as $key => $val){
    echo $key ." / ".$val;
}
 ?>
 
 // 결과 : A / apple B / bottle

 

2. 다양한 foreach 사용 예시 
//다음과 같은 복잡한 배열을 순회하기 배열 예시

Array
(
    [0] => Array
        (
            [field_1] => I5
            [value] => Array
                (
                    [0] => 200
                    [1] => 400
                )

            [stock] => Array
                (
                    [0] => 100
                    [1] => 100
                )

            [price] => Array
                (
                    [0] => 25000
                    [1] => 30000
                )

            [option_code] => Array
                (
                    [0] => OPI220928000001
                    [1] => OPI220928000001
                )

            [is_allow] => Array
                (
                    [0] => Y
                    [1] => Y
                )

        )

    [1] => Array
        (
            [field_1] => I7
            [value] => Array
                (
                    [0] => 200
                    [1] => 400
                )

            [stock] => Array
                (
                    [0] => 100
                    [1] => 100
                )

            [price] => Array
                (
                    [0] => 40000
                    [1] => 0
                )

            [option_code] => Array
                (
                    [0] => OPI220928000001
                    [1] => OPI220928000001
                )

            [is_allow] => Array
                (
                    [0] => Y
                    [1] => Y
                )

        )

)
//위 배열을 순회를 통해 원하는 문자열로 바꿔 만드는 예제 
$optionItem = "";
	foreach($itemList as $row){
		$optionItem .= '{'.$row['field_1']."<";
		$i = 0;
		foreach($row['value'] as $val){
			if($i==0){
			   $optionItem .= $val;
			}else{
			   $optionItem .= ",".$val;
			}
			$i++;
		 }
		 $optionItem .= ">수량<";
		 $i = 0;
		 foreach($row['stock'] as $val){
			if($i==0){
			   $optionItem .= $val;
			}else{
			   $optionItem .= ",".$val;
			}
			$i++;
		 }
			 
		 $optionItem .= ">추가금액<";
		 $i = 0;
		 foreach($row['price'] as $val){
			if($i==0){
			   $optionItem .= $val;
			}else{
			   $optionItem .= ",".$val;
			}
			$i++;
		 }
				 
		 $optionItem .= ">옵션코드<";
		 $i = 0;
		 foreach($row['option_code'] as $val){
			if($i==0){
			   $optionItem .= $val;
			}else{
			   $optionItem .= ",".$val;
			}
			$i++;
		 }
		 $optionItem .= ">사용여부<";
		 $i = 0;
		 foreach($row['is_allow'] as $val){
			if($i==0){
			   $optionItem .= $val;
			}else{
			   $optionItem .= ",".$val;
			}
			$i++;
		 }
	 
	 $optionItem .= ">}";
	 
  }
// foreah 활용 

//특정 key로 이루어진 배열을 순회시켜 기존 데이터와 다르면 수정하기위해 $item_str[$key]에 담는방식으로 활용
$key = array(
            "self_category_code", "self_full_category_code","self_category", "self_full_category" ,"common_category_code" ,"common_full_category_code", "common_category","common_full_category"
        );
			
			
foreach($key as $key){
    if($option->$key != null && $option->$key != ""){
        if($option->$key != $item->$key){
            $item_str[$key] = $option->$key;
        }
    }
}
// 특정 데이터를 조회하여 array에 담기 array-push() 이용
$qry = $this->db2->query("select * from `ws_channel_units_certify` where `item_srl`='".$item->item_srl."'");
$nowCertify = array();
if($qry->num_rows() > 0){
    foreach($qry->result() as $row){
        array_push($nowCertify, $row);
    }
}

//이렇게 만든 배열 $nowCertify 는 이렇게 풀어서 활용합니다.  "배열->키" 형식으로 값을 불러옵니다.

foreach($nowCertify as $cer){
    if($cer->certify_number == $row->certify_number && $certify->full_code == $cer->certify_code){
        $certify_info = $cer;
    }
}
// 넘겨 받은 값중에 특정 키값을 포함한 데이터가 있다면 이를 boolean 값으로 확인하는 방식 으로 활용

$is_self_book = false;
foreach($exceptList as $key){
    if(in_array($key, array("BOK","BOVS","BCHI","BUSE","BFREE", "BEBK","BAUD"))){
        $is_self_book = true;
    }
}
//특정값이 있을경우 즉 내가 허용한 value 값만 보낼때 사용하는 방식 in_array() 활용

if(isset($data->status_sale) && count($data->status_sale) > 0){
    $request .= '<seller:StatusTypeList>';
    foreach($data->status_sale as $row){
        if(in_array($row, array("WAIT","SALE","OSTK","UNADMS","REJECT","SUSP","CLOSE","PHB"))){
            $request .= '<seller:StatusType>'.$row.'</seller:StatusType>';
        }
    }
    $request .= '</seller:StatusTypeList>';
}

 

728x90
LIST
Comments