PHP

PHP - 배열

slcry 2022. 11. 11. 17:39

배열


배열은 간단히 여러 개의 변수를 모아서 정의하는 것을 의미한다. 

만일 30개의 변수가 필요할 때 30개의 변수에 일일이 $a, $b, $c ...와 같이 이름을 붙이는 것은 

매우 힘들지만 $a[1]에서 $a[30]까지 정의하면 간단히 변수를 만들 수 있다. 

이렇게 여러 개의 변수를 간단히 정의한 것을 배열이라고 한다.

 

1. 배열의 구조와 정의
배열은 구조에 따라 1차원 배열과 2차원 이상의 다차원 배열로 나눠진다. 

배열의 차원이 늘어나도 배열의 기본 구조는 동일하므로 1차원 배열에 적용된 

다양한 프로그램 기법은 다차원 배열에도 비슷하게 적용된다.

 

1차원 배열

1차원 배열은 가장 기본적인 배열 구조로 선형으로 나열된 변수와 동일하다.
$ar[1] = 'abc';

 

배열은 배열의 이름과 킷(Key)값 그리고 값을 갖는다. 

예를 들어 $ar[1]='abc' 에서 ar은 배열의 이름이고 대괄호([])안에 

숫자 1은 배열의 킷값으로 첨자라고도 한다. 여기에 할당된 'abc'은 배열에 저장된 값이 된다. 

$ar[1] = 'abc'; 
$ar[2] = 'def';
$ar[3] = 'ghi';

 

위와 같이 $ar에 값을 저장하면 다음과 같이 각 배열의 요소에 값이 저장된다. 

 

$ar

1 2 3
abc def ghi

$ar과 같이 배열의 킷값이 정수인 배열을 스칼라 배열이라 한다. 

하지만 배열의 킷값에 반드시 숫자만 이용하는 것은 아니다. 

킷값은 필요하다면 문자를 사용하는 것도 가능하다. 

 

$row[sno] = 'S01009'; 
$row[sname] = '관우';
$row[syear] = 4;

 

$row 배열은 킷값이 sno, sname, syear이다. 

이렇게 배열의 킷값이 문자인 것을 연관 배열이라고 한다.

 

$ar1 = array(1,2,3);
$ar2 = array(3 => "abc", 4 => "def", "ghi");
$ar3 = array("a" => "ab", "k" => "a2", 0 => 23);

 

array()는 배열을 생성하는 함수이다. 배열은 킷값을 가지므로 필요하다면 

킷값을 지정할 수도 있고 지정하지 않을 수도 있다. 

생성된 $ar1, $ar2, $ar3의 구조는 다음과 같다.

다양한 배열을 생성하고 배열의 구조와 내용을 출력한다.
배열의 생성과 출력 : ar01.php

<?
 $ar1 = array(1,2,3,4,5);
 $ar2 = array(3 => "abc", 4 => "def", "ghi", 8 => "비행기", "사람");
 $ar3 = array("a" => "ab", "k" => "a2", 23, "z" => 34, "bb");
 
 $a1 = count($ar1);
 $a2 = count($ar2);
 $a3 = count($ar3);
 
 print_r($ar1); echo("- count : $a1<br>");
 print_r($ar2); echo("- count : $a2<br>");
 print_r($ar3); echo("- count : $a3<br>");
?>


출력

Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) - count : 5
Array ( [3] => abc [4] => def [5] => ghi [8] => 비행기 [9] => 사람 ) - count : 5
Array ( [a] => ab [k] => a2 [0] => 23 [z] => 34 [1] => bb ) - count : 5

 - 문자로 배열을 지정할때 배열 지정을 안하면 0부터 점점 숫자가 올라가며 카운트된다.

 

foreach문

foreach (배열 as $value){
 실행문;
}
또는 
foreach (배열 as $key => $value){
 실행문;
}

 

 - foreach문은 배열의 요소를 하나씩 변수에 전달하면서 배열의 끝까지 반복하는 반복문이다.
 - $value는 배열의 내용을 저장하고 $key는 배열의 킷값을 저장한다.
 - 연관 배열의 경우 매우 편리하게 배열의 내용을 참조할 수 있다.

 

$ar = array(1,2,3,4,5);
foreach($ar as $value){
 echo("value : {$value}<br>");
}

 

foreach문을 이용하면 배열의 킷값과는 무관하게 배열의 첫 번째 요소로부터 

마지막 요소까지 배열의 내용을 변수에 저장해서 처리하는 것이 가능하다. 

$ar 배열에 저장된 값들은 foreach문의 $value에 순차적으로 하나씩 저장되고, 

이를 출력하면 배열의 모든 요소를 출력할 수 있다.
foreach문을 for문으로 수정하면 다음과 같다.

 

$ar = array(1,2,3,4,5);
for($i = 0; $i < 5; $i++){
 $value = $ar[$i];
 echo("value : {$value}<br>");
}

 

배열을 for문으로 처리할 경우 배열의 킷값이 연속된 정수가 아니거나 

연관배열이라면 프로그래밍이 곤란하고 배열이 몇 개의 요소로 이뤄졌는지 

확인하는 과정이 필요하다. 그러나 foreach문은 이런 과정이 필요치 않음으로 배열을

 처리하는데 for문에 비해서 훨씬 쉽게 프로그램 제작이 가능하다.

$ar = array("a" => "ab", "k" => "a2", 23, "z" => 34, "bb");
foreach($ar as $key => $value){
 echo("key&value : {$key}-{$value}<br>");
}

 

foreach문은 배열의 값 뿐 아니라 배열의 킷값도 변수에 저장 가능하다. 

위와 같이 연관 배열인 경우 배열의 킷값은 연속적인 정수가 아님으로 이를 

참고하는 것은 매우 어려운 작업이지만 foreach문을 이용하면 간단히 참고할 수 있다. 

 

배열 내에 짝수의 합과 홀수의 합을 출력한다.
배열의 생성과 출력 : ar02.php

<?
 $odd = 0;
 $eve = 0;
 $ar = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
 
 foreach($ar as $value){
 if($value%2 == 0)
    $eve = $eve + $value;
  else
    $odd = $odd + $value;
    }
   echo("짝수의 합 : {$eve}<br>
         홀수의 합 : {$odd}");
?>

 

배열 내에 소수를 출력한다.

배열내에 소수 출력

<?
 $ar = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
 foreach($ar as $value){
   if($value > 1){
     for($i = 2; $value % $i != 0; $i++){}
     if($value == $i) echo("$value &nbsp;&nbsp;");
   }
 }
 echo("<br><hr><br>");
//-------------------------------------------------------
 $cn = count($ar);
 for($i=0; $i<$cn; $i++){
   $value = $ar[$i];
   if($value > 1){
     for($j = 2; $value % $j != 0; $j++){}
     if($value == $j) echo("$value &nbsp;&nbsp;");
   }
 }
 echo("<br><hr><br>");
 show_source(__FILE__);
?>

 

배열 내에 소수의 합을 출력한다.

배열의 생성과 출력 : ar_pri.php

<?
  function pri($i)
  {
    for($j = 2; $i % $j != 0; $j++){}
      if($i == $j) return 1;
      else return 0;
  }
 $ar = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
 $sum = 0;
 foreach($ar as $value){
     if($value<2) continue;
     if(pri($value)) 
       $sum = $sum + $value;
   }
   echo("소수의 합 : {$sum}");
?>

 

2차원 배열

 

2차원 배열은 엑셀과 같은 스프레드쉬트 프로그램에서 보는 것처럼 행과 열을 가진 배열을 의미한다. 

2차원 배열은 이전에 사용한 1차원 배열과 달리 킷값이 두 개인 배열로 

각각의 킷값은 행과 열을 의미한다.

$ar[0][0] = "a"; $ar[0][1] = "b"; $ar[0][2] = "c";
$ar[1][0] = "d"; $ar[1][1] = "e"; $ar[1][2] = "f";
$ar[2][0] = "g"; $ar[2][1] = "h"; $ar[2][2] = "i";

 

$ar

  0 1 2
0 a b c
1 d e f
2 g h i

 

2차원 배열의 킷값을 기술할 때는 [행번호][열번호]순으로 기술한다. 

예를 들어 $ar[2][1]은 2행 1열의 데이터로 "h"값을 나타낸다. 
2차원 이상인 배열을 다차원 배열이라 하는데 다차원 배열은 킷값의 개수를 늘려 

3차원 배열이나 4차원 배열로 확장이 가능하다.

 

다음은 array() 함수를 이용 $ar 배열을 생성한 것이다. 

$ar = array(array("a","b","c"), array("d","e","f"),array("g","h","i"))

 

2차원 배열을 array() 함수를 이용해서 생성할 때 array()를 중첩해서 다차원 배열을 생성한다. 

이와 같은 방법은 가독성이 높아 일반적으로 사용되는 배열 생성 방법이다. 

$ar = array(array(학번 => "915301",이름 => "공융", 학과 => "화학"),
      array(학번 => "915302",이름 => "사마간", 학과 => "화학"),
      array(학번 => "925303",이름 => "단규", 학과 => "화학"))

 

$ar 학번 이름  학과
0 915301 공용 화학
1 915302 사마간 화학
2 915303 단규 화학

2차원 배열은 킷값이 두 개로 배열의 요소가 두 개의 킷값에 의해 결정된다. 

이로 인해 1차원 배열과 같이 $ar[0]이 스칼라 변수와 같이 값을 저장하는 것이 아니다. 

$ar[0]는 이제 1차원 배열로 간주된다. 즉 $ar[0]는 (학번 => 915301, 이름 => 공융, 학과 => 화학)인 연관 배열로 인식된다. 

프로그래머는 2차원 배열 $ar을 다룰 수도 있지만 필요 하다면 $ar[0], $ar[1], $ar[2]와 같은 1차원 
배열로 문제를 바꿔 다룰 수도 있다. 

물론 3차원 배열도 중첩된 2차원 배열로 간주하고 프로그래밍 할 수 있다. 

PHP는 이를 통해 배열 관련된 다양한 함수들을 차원과 무관하게 사용한다.

foreach($ar as $key => $value){
 echo("key_row = $key : ");
 foreach($value as $key1 => $value1) {
 echo("[$key1] => $value1 ");
 };
};

2차원 배열의 각 행을 1차원 배열로 추출한 다음 추출된 1차원 배열을 출력한다.

$count = count($ar);
for($i = 0; $i < $count; $i++) {
 echo("row = $i : {$ar[$i]['학번']} - {$ar[$i]['이름']} - {$ar[$i]['학과']} <br>");
}

for문을 이용하는 방법은 먼저 2차원 배열의 행의 수를 확인한 다음 행을 순서대로 읽어서 출력하는 방법이다. 

가장 읽기 편리하지만 행 번호에 해당하는 킷값이 정수로 구성돼야 한다는 단점이 있다.
그러나 이 방법은 가장 가독성이 높아서 프로그래밍에서 많이 사용되는 방법이다.
Count() 함수는 1차원 배열에서는 배열 요소의 수를 반환하고 2차원 배열에서는 행수를 반환한다.

 

2차원 배열의 출력

다양한 2차원 배열 출력 : ar03.php

<?
 $ar = array(array(학번 => "915301",이름 => "공융", 학과 => "화학"),
             array(학번 => "915302",이름 => "사마간", 학과 => "화학"),
             array(학번 => "925303",이름 => "단규", 학과 => "화학"),
             array(학번 => "915304",이름 => "마초", 학과 => "화학"));
 
 foreach($ar as $key => $value){
            echo("key_row = $key : ");
            foreach($value as $key1 => $value1) {
               echo("[$key1] => $value1 ");
            };
            echo("<br>");
   }
   echo("<hr>");
 
 $count = count($ar);
 for($i = 0; $i < $count; $i++) {
    echo("row = $i : {$ar[$i][학번]} - {$ar[$i][이름]} - {$ar[$i][학과]} 
<br>");
 }
?>