프로그래밍 언어들

배열

토픽 프로그래밍 언어들 > PHP

배열

배열이란 다른 언어에서는 리스트라고도 하는 형태의 데이터 타입이다.  배열은 연관된 데이터를 모아서 관리하기 위해서 사용하는 데이터 타입이다. 변수가 하나의 데이터를 임시로 저장하기 위한 것이라면 배열은 여러 개의 데이터를 저장하기 위한 것이라고 할 수 있다. 아래의 예제를 보자. 변수 name에는 문자 egoing이 할당되었다. 이제부터 name을 호출하면 문자 egoing을 사용할 수 있다.

/array/1.php 

<?php
$name = 'egoing';
echo $name;
?>

배열의 생성

그렇다면 여러 개의 데이터를 하나의 변수에 담아서 관리할 수 있는 방법은 없을까? 있다. 배열을 쓰면 된다. 변수 member에 회원정보를 담아보자. 대괄호([])는 배열을 만드는 기호다. 대괄호 안에 데이터를 콤마(,)로 구분해서 나열하면 배열이 된다.

/array/2.php 

<?php
$member = ['egoing', 'k8805', 'sorialgi'];
?>

하나의 변수에 3개의 데이터를 담았다. 각각의 데이터를 요소(element)라고 부른다.

php 5.4 이전 버전에서는 아래와 같은 문법을 사용해야 한다. 따라서 하위 호환성을 위해서는 아래의 형식을 사용하는 것이 권장된다.
<?php
$member = array('egoing', 'k8805', 'sorialgi');
?>

자 그럼 이 데이터를 꺼내오려면 어떻게 해야 할까? 아래의 예제를 보자.

/array/3.php 

<?php
$member = ['egoing', 'k8805', 'sorialgi'];
echo $member[0].'<br />';
echo $member[1].'<br />';
echo $member[2].'<br />';
?>

결과는 다음과 같다.

egoing
k8805
sorialgi

즉 배열에 담겨있는 값을 가져올 때는 대괄호 안에 숫자를 넣는다. 이 숫자를 색인(index)라고 부르고 0부터 시작한다. 이 값을 이용해서 배열에 저정된 값을 찾을 수 있다.

배열이 없다면

그렇다면 배열이 없다면 어떻게 될까? 예를 들어 맴버의 이름을 제공하는 함수를 제공해야 한다고 해보자. 그런데 함수는 하나의 값만을 반환(return) 할 수 있다. 아래의 예를 보자.

/array/4.php 

<?php
function get_member1(){
    return 'egoing';
}

echo get_member1().'<br />';


function get_member2(){
    return 'k8805';
}

echo get_member2().'<br />';


function get_member3(){
    return 'sorialgi';
}

echo get_member3().'<br />';

?>

하나의 함수는 하나의 값만을 반환할 수 있기 때문에 위와 같이 각각의 회원정보를 반환하는 함수를 만들었다.

이번엔 배열을 이용한 아래의 코드를 보자. 맴버를 담고 있는 배열을 반환하고 있다. 간단하지 않은가?

/array/5.php

<?php
function get_members(){
    return ['egoing', 'k8805', 'sorialgi'];
}

var_dump(get_members());

?>

함수의 리턴값이 배열이라면 특정한 요소를 아래와 같은 방법으로 가져올 수 있다.

<?php
function get_members(){
    return ['egoing', 'k8805', 'sorialgi'];
}

$tmp =  get_members();
echo $tmp[1];

?>

PHP의 버전이 5.4 이상이라면 아래와 같은 방법으로도 가져올 수 있다. 좀 더 간단하다.

<?php
function get_members(){
    return ['egoing', 'k8805', 'sorialgi'];
}

echo get_members()[1];

?>

배열의 사용

배열의 진가는 반복문과 결합했을 때 나타난다. 반복문으로 배열에 담긴 정보를 하나씩 꺼내서 처리 할 수 있기 때문이다. 다음 예제를 보자 .

/array/8.php

<?php
function get_members(){
    return ['egoing', 'k8805', 'sorialgi'];
}

$members = get_members();

for($i = 0; $i < count($members); $i++){
    echo ucfirst($members[$i]).'<br />';
}

?>

결과는 아래와 같다.

Egoing
K8805
Sorialgi

위의 예제에서 주목해야 할 것은 반복문과 배열을 결합한 부분이다. 반복문을 이용해서 배열 $members의 내용을 하나씩 꺼낸 후에 이름의 첫글자를 대문자로 변경한 후에 출력하고 있다. (알파벳의 첫글자를 대문자로 만드는 방법은 ucfirst를 참고) 정리하면, 배열이란 연관된 정보를 하나의 그룹으로 관리하기 위해서 사용한다. 그리고 그 정보를 처리 할 때는 반복문을 주로 이용한다.

배열의 제어

배열은 복수의 데이터를 효율적으로 관리, 전달하기 위한 목적으로 고안된 데이터 타입이다. 따라서 데이터의 추가/수정/삭제와 같은 일을 편리하게 할 수 있도록 돕는 다양한 기능을 가지고 있다. 몇가지 중요한 기능들만 살펴보자.

배열 크기

아래와 같은 방법으로 배열의 크기를 알아낼 수 있다.

/array/9.php

<?php
$l = [1, 2, 3, 4, 5];
echo count($l);
?>

배열의 조작

추가

다음은 배열의 끝에 아이템을 추가하는 방법이다. 실행결과 배열 li는 a, b, c, d, e, f가 됐다.

/array/10.php

<?php
$arr = ['a', 'b', 'c', 'd', 'e'];
array_push($arr, 'f');
var_dump($arr);
?>

다음은 복수의 아이템을 배열에 추가하는 방법이다.

/array/11.php

<?php
$li = ['a', 'b', 'c', 'd', 'e'];
$li = array_merge($li, ['f','g']);
var_dump($li);
?>

다음은 배열의 시작점에 아이템을 추가하는 방법이다. 배열 li는 z, a, b, c, d, e가 됐다. insert의 첫번째 인자는 추가할 아이템의 위치를 의미하고 두번째 인자는 추가할 값을 의미한다.

/array/12.php

<?php
$li = ['a', 'b', 'c', 'd', 'e'];
array_unshift($li,'z');
var_dump($li);
?>

만약 두번째 인덱스 뒤에 대문자 B를 넣고 싶다면 아래와 같이한다.

/array/15.php

<?php
$li = ['a', 'b', 'c', 'd', 'e', 'z'];
array_splice($li, 2, 0, 'B');
var_dump($li);
?>

제거

다음은 배열의 첫번째 요소를 제거하는 방법이다. 

/array/14.php

<?php
$li = ['a', 'b', 'c', 'd', 'e', 'z'];
array_shift($li);
var_dump($li);
?>

다음은 배열의 마지막 요소를 제거하는 방법이다. 

/array/13.php

<?php
$li = ['a', 'b', 'c', 'd', 'e', 'z'];
array_pop($li);
var_dump($li);

배열에 특정 위치에 값을 추가하고 제거하는 것은 자주 사용된다. 아래의 그림을 보면 좀 더 명확하게 이해가 갈 것이다. 이 관계를 외울 필요는 없지만 잘 따져보자.

정렬

다음은 정렬하는 방법이다. 결과는 a, b, c, d, e 다.

/array/16.php

<?php
$li = ['c','e','a','b','d'];
sort($li);
var_dump($li);
?>

역순으로 정렬하고 싶을 때는 아래와 같이 한다.

/array/17.php

<?php
$li = ['c','e','a','b','d'];
rsort($li);
var_dump($li);
?>

연관배열

지금까지 살펴본 배열은 아이템에 대한 식별자로 숫자를 사용했다. 데이터가 추가되면 배열 전체에서 중복되지 않는 인덱스가 자동으로 만들어져서 그 데이터에 대한 식별자가 되는 것이다. PHP에서는 인덱스로 문자를 사용하는 것도 가능하다. 일반적으로 다른 언어에서는 숫자를 인덱스로 사용하는 것을 일반적으로 배열, 혹은 indexed array라고 하고, 문자를 인덱스로 사용하는 것을 연관배열(associative array, hash, dictionary)라고 부르지만 PHP에서는 이를 특별히 구분하지 않고 있기 때문에 하나의 배열의 키 값으로 숫자와 문자 모두를 사용할 수 있다.

연관배열의 생성

다음은 연관배열을 만드는 법이다.

/array/18.php

<?php
$grades = array('egoing'=>10, 'k8805'=>6, 'sorialgi'=>80);
?>

위의 예제에서 egoing은 key가 되고, 10은 value가 된다. 아래는 연관배열을 만드는 다른 방법이다.

/array/19.php

<?php
$grades = [];
$grades['egoing'] = 10;
$grades['k8805'] = 6;
$grades['sorialgi'] = 80;
var_dump($grades);
?>

다음은 특정한 key의 값을 가져오는 법이다. 결과는 80이다.

<?php
$grades = array('egoing'=>10, 'k8805'=>6, 'sorialgi'=>80);
echo $grades['sorialgi'];
?>

다음은 배열의 데이터를 기준으로 반복작업을 하는 방법이다.

<?php
$grades = array('egoing'=>10, 'k8805'=>6, 'sorialgi'=>80);
foreach($grades as $key => $value){
    echo "key: {$key} value:{$value}<br />";
}
?>

결과는 아래와 같다.

key : sorialgi  value : 80
key : k8805     value : 6
key : egoing    value : 10

foreach 문은 $grades 위치의 배열에 담긴 요소의 숫자만큼 반복문을 실행한다. 반복문이 실행될 때마다 요소의 키값을 $key 자리의 변수에 요소의 값을 $value 자리의 변수에 할당해서 반복문 안에서 접근 할 수 있도록 한다. 위의 방법을 통해서 배열 안에 담긴 모든 값을 가져 올 수 있다.

참고

댓글

댓글 본문
  1. DreamBoy
    2023.10.26. PHP - 배열 파트 수강했습니다.
  2. dueto park
    2022.07.05. 배열 수강 완.
  3. 코드파괴자
    22.05.20 complete.
  4. 드림보이
    2022.01.18. 배열 파트 수강완료
  5. ggyuker
    22.01.02 수강완료 90% 이해
  6. 최건호
    2021. 10. 13 양질의 강의 너무 감사드립니다 ㅠㅠ
  7. jeisyoon
    2021.07.25 Array - OK
  8. diabullet
    감사합니다!!
  9. 선대범
    저만 저장하고 나서 브라우저에서 볼 때 느리게 나오나요?
  10. 김남규
    연관 배열만큼은 기존에 너무나도 이해하기 쉽게 해준 것과는 약간 대조되는 수업이랄까... 너무나도 감사히 보았습니다. 어렵어렵. 굽신굽신 ㅋㅋ.. 좋아요 0 실환가.. 싶네요...
  11. wico
    감사합니다.
  12. choon
    감사합니다.
  13. 홍콩돼지
    저도 php는 거의 처음배우지만 프로그래머로써 견해는 이렇습니다,
    php 엔진이 각 os 마다 c++언어로 되있고 이는 이미 php개발자들이 빠른 실행을 위해 검증을 거친 알고리즘을 사용할 것이라는 말일겁니당, 현재 많이 사용하는 언어 중 low level에 가장 가까운 c로 이미 최적화를 거친 알고리즘을 사용했기 때문에 저희가 괜히 어줍잖게 만드는것보다는 기존 함수를 쓰는게 이로우리라 이야기하신 것 같아요. 저도 ~~같아요 라고 말하고 강의를 보니 이고잉님도 ~~일겁니다 라고 말하시는경향이 있는데 사실 프로그래밍 스타일이 한가지만 있는것도 아니고 기술들이 없다가도 생기기 때문에 전체적인 경향이 이렇다 라고 받아주시면 될거에요!
    대화보기
    • 호두
      foreach
      고맙습니다
    • 호두
      foreach
      고맙습니다
    • Sylar
      $li[0] = 6; 하면 되지 않나요?
      대화보기
      • Sylar
        $li = [1,2,3,4,5];
        sort($li);
        var_dump($li);
        rsort($li);
        var_dump($li);

        sort, rsourt 함수 확인해보시면 될꺼 같아요.
        대화보기
        • 말봉
          맨 처음 배열 값을 바꾸는 함수는 뭔가요 ?
        • 넷째형
          rsort 문자만 되는건가요? 숫자는 항상 12345순으로 정렬되던데 숫자를 역순으로 정렬하려면 어떻게 해야할까요?
        • 넷째형
          array_splice 써서 중간에 삽입할때 3번쨰 0 은 무슨 의미인가요?
          값을 바꿔봐도 뭐가 바뀌는건지 모르곘네요
        • php초보
          와 정말 감사합니다. 서서히 머릿속에 들어가는 기분이 너무 좋네요!
        • 감사합니다 덕분에 빠르게 학습하고 있습니다
        • 경엽
          감사합니다. 잘보고 있습니다.
        • 다시시작
          완료
        • 고스트프리
          너무 좋습니다. 열심히 해야겠어요.
        • 익임한
          감사합니다 항상 잘 보고 있어요!

          별건 아닌데 매우 사소한 거 하나가 궁금해서 그런데 혹시 답변 가능하실지요?

          배열 제어 설명 뒷부분에서 php에서 배열 제어하는 여러가지 방법들 소개 해 주시면서, 아마 여기 있는걸 쓰는게 C++같은 로우 레벨 언어로 만들어 진거라서 직접 만든것보다 " 확률적으로" 빠를 것이라고 하셨는데
          그러면 php로 매우 잘 만들면 그 효율을 뛰어넘을수도 있는건가요? 그 간격? 이라고 해야하나 그게 어느정도인건지 궁금하네요 (기본 지식이 많지 않은 학생이라서요 정말 저급한 질문인 것 같긴 하네요 ..)
        • kimjs9105
          며칠전에 개발자분이 작성해준 코드에 foreach문이 있었는데 오늘 배웠으니 다시 한번 그부분을 봐야겠어요~ 감사합니다~
        • spiritord
          감사합니다
        • sheis
          잘 봤어요^^
        • 심화평
          17.07.13 감사합니다..^^
        • 김세창
          이해가 잘 됬네요 감사합니다~^^ ㅎㅎ
        • php가첫취업?
          배열은 복습한번 더 해 봐야겠습니다..아는데도 모르는 신기한 현상 ㅠㅠ
        • NamJin Kim
          감사합니다
        • 신입1
          감사합니다.
        • 허민호
          감사합니다
        • JustStudy
          고맙습니다
        • 코딩꿀잼!
          http://mizzhin.blog.me......298

          이번 강의에서 오류가 나길래 봤더니 5.4버전기준으로 코딩된거였네요
          저기 블로그에서 참고하셔서 업글하시면 도움됩니다~
        • 진돌
          강좌 정말 감사히 잘 공부하고 있습니다!!!
        • 코딩!
          배열을 컨트롤할 수 있는 방법이 정말 많네요!!
        • sssssqew
          연관배열은 C 문법에는 없는 거네요. 인덱스에 해당하는 값에 어떤 의미가 있는지 연관배열을 쓰면 더 잘 이해할 수 있겠네요. ^^
        • 샤핀
          //자문자답 : 다음 강좌를 보니 생략 가능하군요! ^^;;
          위의 코드에는 PHP 구문의 종료를 의미하는 닫히는 기호가 없다. 닫히는 기호는 생략이 가능하다.

          13.php 소스 맨 끝에
          ?>
          가 빠져있는 거 같습니다. ^^;
        • JPARK
          연관배열에서 질문드립니다.
          연관배열에서 key값과 value 값을 지정한다음에 그 순서를 바꾸고 싶어서 "rsort"를 사용해봤는데 values값은 거꾸로 출력이 되는데 key값이 새로운 0 ,1 , 2 이런식으로 지정이되네요..
          만약에 key값을 유지한채로 "rsort"를 사용하고 싶으면 어떻게 해야 하나요?
        • chase
          예제를 먼저 보고 영상을 봤는데요, 마지막 foreach 예제를 봤을 때, 조금 헷갈릴수도 있겠다는 생각이 들었어요. foreach 수행은 egoing=>10, k8805=>6, sorialgi=>80 순서로 하는데, 결과는 그 역순이고, 값 사이에 tab이 들어가 있어서, 뭔가 특별한 이런 기능들이 들어있는줄 알았습니다...ㅎㅎㅎ
        • egoing
          수정했습니다. ^^
          대화보기
          • lazynius
            어느샌가 생활코딩이 저의 프로그래밍 레퍼런스가 되었네요

            별건 아닌데 '연관배열의 생성' 바로 위 단락에

            '인반적으로' 라는 오타가 있네요 ^^

            좋은 내용 감사합니다!
          • ddojai
            본문중 /array/12.php 예제 위 설명이 예제와 다른 것 같습니다.
          • 히시기
            잘 봤습니다! 감사합니다 ^^
          • egoing
            맞습니다. 다만 저는 Ruby의 해쉬를 언급한 것 입니다 :)

            http://www.ruby-doc.org......tml
            대화보기
            • boanuge
              좋은 강의 정말 감사합니다. PHP 배열이 쏙쏙 와닿네요.
              근데, 참고로 제가 알기론 (Key, Value) 형식의 연관배열은 자바에서 Map으로 부르는 것으로 알고 있습니다.
              Hash는 검색(및 저장) 알고리즘의 하나이구요. 그래서 Hash 알고리즘을 사용하는 (Key, Value) 형식의 배열을 Hashmap이라고 하죠. :)
            • egoing
              흐흐 고맙습니다.
              대화보기