본문 바로가기

웹프로그래밍

[PHP 프로그래밍 입문 5장~6장] 배열과 함수

배열

배열을 정의하는 방법은 두 가지가 있다. 

//(1) ~ (3) 모두 같은 의미임

//(1)
$score[0] = 1;
$score[1] = 4;
$score[2] = 33;

//(2)
$score=[1,4,33];

//(3)
$score = array(1,4,33);
<?php

$class = array("egoing","k8805");
echo "$class[0]<br>";
echo $class[1];

?>
<?php

$class = ["egoing", "k8805"];

echo "$class[0] <br>";
echo "$class[1]";

?>

인덱스를 통해 배열에 접근한다. 0부터 시작

 

배열을 이용해서 성적의 합계와 평균 구하기

?php

$score[0]=90;
$score[1]=80;
$score[2]=85;
$score[3]=95;
$score[4]=93;

$sum = 0;
for($i = 0; $i<5;$i++){
	$sum +=$score[$i];
}
$avg = $sum / 5;

echo "과목 합: $sum<br>";
echo "과목 평균: $avg";

?>

 

array() 함수 이용해서 성적의 합계와 평균 구하기

<?php
$score = array(90,80,85,95,93);


$sum = 0;
for($i = 0; $i<5;$i++){
	$sum +=$score[$i];
}
$avg = $sum / 5;

echo "과목 합: $sum<br>";
echo "과목 평균: $avg";

?>

같은 결과 출력된다. 

 

배열 이용한 구구단 표 만들기

a라는 배열과 b라는 배열에 for문을 돌려서 값을 저장한다.

-> 그 값을 토대로 구구단을 만든다

$a[0]으로 2단 만들고, $a[3]으로 5단 만든다. 

<?php
//단수 저장
for($i = 0; $i <=7; $i++){
	$a[$i] = $i+2;
     echo "$a[$i] ";
}
echo "<br>";
//1~9 저장
for($j = 0; $j <=8; $j++){
	$b[$j] = $j+1;
	echo "$b[$j] ";
}

echo "<br>----------<br>";
//2단 구구단
for($i = 0;$i<9; $i++){
	$r = $a[0] * $b[$i];
	echo "$a[0] x $b[$i] = $r<br>";
}
echo "----------<br>";
//6단 구구단
for($i = 0;$i<9; $i++){
	$r = $a[4] * $b[$i];
	echo "$a[4] x $b[$i] = $r<br>";
}
?>

배열과 버블 정렬

버블 정렬은 인접한 2개의 원소를 비교하면서 값을 정렬하는 방식

오름차순으로 버블 정렬하기

num 안에 인덱스 부분 $j !!!!!! 이런 오류 조심할 것 !!!!!!

<?php

$num = array(15,13, 9, 7, 6, 12, 19, 30, 28, 26);
$count= 10;

echo "정렬 전 ";
for($a = 0; $a<10;$a++){
	echo $num[$a]." ";
}
echo "<br>";

for($i = $count-2; $i >=0; $i--){
	for($j=0; $j <=$i; $j++){
		if($num[$j]>$num[$j+1]){
			$temp = $num[$j];
			$num[$j] = $num[$j+1];
			$num[$j+1] = $temp;

		}

	}
}
echo "버블 정렬(오름차순) 후 ";

for($a = 0; $a<10;$a++){
	echo $num[$a]." ";
}

?>

여기서 $i는 현재 정렬되지 않은 부분의 마지막 인덱스를 나타냅니다. 바깥쪽의 for 루프는 배열의 끝에서부터 시작하여 정렬되지 않은 부분을 하나씩 줄여나가는 역할을 합니다.

안쪽의 for 루프는 현재 정렬되지 않은 부분에서 인접한 두 원소를 비교하고 조건에 맞지 않으면 교환하는 역할을 합니다. 따라서 내부 루프가 한 번 실행되면 가장 큰 원소가 정렬된 부분의 맨 끝으로 이동합니다.

즉, 바깥쪽 루프는 배열의 끝에서부터 시작하여 정렬되지 않은 부분을 하나씩 줄여나가고, 안쪽 루프는 현재 정렬되지 않은 부분에서 인접한 두 원소를 비교하고 정렬하는 역할을 합니다. 이를 통해 전체 배열이 정렬되게 됩니다.

 

 

<?php
//배열과 버블정렬
//임의의 배열을 만든다.
$num = array(12,53,566,2345,22,555,21,44);

$count = 8;

//정렬 전
echo "정렬 전";
for($i = 0; $i < $count ;$i++){
	echo "$num[$i] ";
}

//오름차순
for($i = $count -2; $i>=0; $i--){
	for($j = 0 ; $j<=$i; $j++){
		 if($num[$j]>$num[$j+1]){
		 	$temp = $num[$j];
		 	$num[$j] = $num[$j+1];
		 	$num[$j+1] = $temp;
		 }
	}
}

echo "<br>";
//정렬 후
echo "정렬 후";
for($i = 0; $i < $count ;$i++){
	echo "$num[$i] ";
} 

?>

버블정렬 내림차순하려면????

 

주의할 점은 비교 부분에서 부등호 방향을 바꿔주면 됩니다. 오름차순에서는 $num[$j] > $num[$j + 1]이지만, 내림차순으로 변경할 때는 $num[$j] < $num[$j + 1]로 바꿔야 합니다.

<?php
//배열과 버블정렬
//임의의 배열을 만든다.
$num = array(12,53,566,2345,22,555,21,44);

$count = 8;

//정렬 전
echo "정렬 전";
for($i = 0; $i < $count ;$i++){
	echo "$num[$i] ";
}

//내림차순
for($i = $count -2; $i>=0; $i--){
	for($j = 0 ; $j<=$i; $j++){
		 if($num[$j] < $num[$j+1]){
		 	$temp = $num[$j];
		 	$num[$j] = $num[$j+1];
		 	$num[$j+1] = $temp;
		 }
	}
}


echo "<br>";
//정렬 후
echo "정렬 후";
for($i = 0; $i < $count ;$i++){
	echo "$num[$i] ";
} 

?>

 

2차원 배열

array 안에 정의해주는 array도 마찬가지로 array() 함수를 이용해서 정의해야만 한다. 그냥 ( )만 넣으면 오류남!!!

<?php
//2차원 배열
$score = array(array(2,3,4,33), array(2,3,5,11), array(11,45,11,14));

//2 3 4 33
//2 3 5 11
//11 45 11  14의 모양을 가지는 score[2][3]짜리 2차원 배열이다.

echo $score[1][2]; //5 출력될 

?>


<?php
//2차원 배열
$score = [[2,3,4,33], [2,3,5,11],[11,45,11,14]];

//2 3 4 33
//2 3 5 11
//11 45 11  14의 모양을 가지는 score[2][3]짜리 2차원 배열이다.

echo $score[1][2]; //5 출력될 

?>

2차원 배열을 이용하여 성적의 합계와 평균 구하기

배열명[행][열] [세로 크기][가로 크기]

 

이중 for문 작성할 때 바깥에는 세로 기준이고, 안에는 가로 기준임. 

세로1 -> 가로 주루룩 데이터 훑고

세로2 로 넘어감!

2차원 배열의 값을 " "로 감싸게 되면 오류 발생 !!

2차원 배열의 값은 큰 따옴표로 감싸면 안 된다 !!!!!!!

<?php
//2차원 배열이 됨
//아래와 같은 모양
//88 98 96 77 63
//86 77 ...
//74 83 95 8....
//score[0][0] ~score[2][4] 세로 가로 크기

$score = array(array(88,98,96,77,63), array(86,77,66,86,93),array(74, 83, 95, 86, 97));
for($i = 0; $i<3; $i++){
	for($j = 0; $j<5; $j++){
		echo "\$score[$i][$j] ="."$score[$i][$j]"."<br>";
	}
}
?>

2차원 배열의 값에 " "를 없애면 오류가 발생하지 않는다. 


<?php
//3명의 학생이 존재하고, 각 학생은 5개의 과목에 대한 평균 값을 가지고 있다. 
//1. 학생별 모든 과목의 평균은?
$score = array(array(88,98,96,77,63), array(86,77,66,86,93),array(74, 83, 95, 86, 97));

for($i = 0; $i <3; $i++){ //행 기준으로 먼저(학생별)
	for($j = 0; $j <5; $j++){//모든 과목 값 가져오기
       echo "\$score[$i][$j] = ".$score[$i][$j]."<br>";
	}
     echo "<br>";
}
echo "<br>";


for($i = 0; $i <3; $i++){ //행 기준으로 먼저(학생별)
	
	$sum = 0;

	for($j = 0; $j <5; $j++){//모든 과목 값 가져오기
		$sum += $score[$i][$j];
       
	}
     $avg = $sum / 5;
	 echo "$i 번 학생의 점수 => 합계 : {$sum}, 평균 :  $avg<br>";
}

echo "<br>";

//2. 과목별 평균은??
//행 먼저 쭈루룩 실행해야 됨
for($i = 0; $i <5; $i++){ //각 학생에 대해(열)

	$sum2 = 0;

	for($j = 0; $j <3; $j++){ //모든 과목(행)
            $sum2 += $score[$j][$i];
	}
    $avg = $sum2 / 3;
   echo "과목 $i 번째의 합계 : $sum2 평균 : $avg <br>";
}
?>

1차원 배열의 값은 echo 문에서 " "로 감싸줘도 결과가 잘 출력이 된다. 

$score = array('dd','ddw');

echo "$score[0]";
?>

 

 

합계 초기화하는 부분 중요 !!!! 학생마다의 합계와 평균을 구해야 하니깐 !

<?php
//2차원 배열이 됨
//아래와 같은 모양
//88 98 96 77 63
//86 77 ...
//74 83 95 8....
//score[0][0] ~score[2][4] 세로 가로 크기

$score = array(array(88,98,96,77,63), array(86,77,66,86,93),array(74, 83, 95, 86, 97));
for($i = 0; $i<3; $i++){
	for($j = 0; $j<5; $j++){
		echo "\$score[$i][$j] =".$score[$i][$j]."<br>";
	}
		echo "<br>";
}

//3명 학생의 성적 합계와 평균
for($i = 0; $i<3; $i++){

$sum = 0; //값 초기화
	for($j = 0; $j<5; $j++){

      $sum += $score[$i][$j];

}
$avg = $sum / 5;
$student_num = $i+1;

echo "$student_num 번 학생의 점수 => 합계 : {$sum}, 평균 : $avg<br>";
}


?>

배열은 $배열명[$인덱스변수]의 형태로 while문이나 for문 같은 반복문과 함께 사용된다.

 

연습 문제

03.

$배열명[$인덱스명]

배열도 마지막은 세미콜론 꼭 붙이기 !!!

<?php
$subject = array('파이썬', 'php', '자바스크립트', '사진', '영화감상');
$name = array('ㄱ','ㄴ','ㄷ','ㄹ','ㅁ','ㅂ','ㅅ','ㅇ','ㅈ','d');

//각 과목당 10명의 학생 성적을 나타낸 2차원 배열
$score=array(array(80,79,90,89,100,87,85,83,96,99),
	array(70,88,70,85,60,95,77,89,82,93),
	array(80,79,90,89,100,87,85,83,96,99),
	array(70,88,70,85,60,95,77,89,82,93),
	array(80,79,90,89,100,87,85,83,96,99)
);
//학생별로 5개 과목의 성적 합계와 평균

for($i = 0; $i <10; $i++){
	$sum = 0;
	for($j=0; $j <5;$j++){
      $sum += $score[$j][$i];
	}
	$avg = $sum / 5;
	echo "$name[$i] 학생의 합계: $sum, 평균: $avg<br>";
}
?>

 

2단 구구단 만들기 2

1. 이중 for문 사용해서 만들기

2. 2차원 배열에 저장해놓은 값 출력하기

 

1) 하나의 값이 한 줄에 9개 있다. for문

2) 1)에서 만든 하나의 행이 9번 반복된다. for문

=> 이중for문

<?php
//2차원 배열에 곱한 값들 저장하기
//행별로 2~9단 값 저장할 거임
echo "<table border='1'>
	<tr><td>2단</td><td>3단</td><td>4단</td><td>5단</td><td>6단</td><td>7단</td><td>8단</td><td>9단</td></tr>";
for($r=0; $r<=7; $r++){
	for($c=0; $c<=8; $c++){
		$result[$r][$c] = ($r+2)*($c+1);
	}
}

//저장한 값 불러오기
//각 tr에 2,3,4,,,, 이니깐 세로 기준 쭈루룩이어야 됨
for($c=0; $c<=8; $c++){
	echo "<tr>";
for($r=0; $r<=7; $r++){
    $a = $r +2;
    $b = $c + 1;
    $re = $result[$r][$c];
    echo "<td> $a * $b = $re </td>";
}
	echo "</tr>";

}
echo "</table>";
?>


함수

함수는 내장 함수와 사용자 함수가 있다. 

함수는 정의(define)과 호출(call)로 나뉜다.

 

출력 시 사용되는 키워드는 return

return문으로 함수의 값이 반환되면 바로 함수가 종료된다. 

함수 안에 return문이 여러 개 있다면 맨 처음에 존재하는 return문의 값만 반환된다.

return을 했다고 해도 화면에 보여주기 위해서는 echo 문장에서 함수를 호출해야 한다. 

<?php

function a(){
	return 'a';
	return 'b';
	return 'c';
}
echo a();
?>

 

입력 시 사용되는 것은 매개변수(인자)

$arg =1;이라고 정의해주는 것과 마찬가지이다. 

복수의 입력값도 넣어줄 수 있다. 

<?php

function a($arg){
	return $arg;
}
print a(1);
?>

<?php

function a($arg1, $arg2){
	return $arg1 + $arg2;
}
echo a(10,20);
echo a(20,30);

?>

 

함수 내에서 할당된 변수는 그 지역에서만 유효하다. 그 지역 바깥으로 나오면 존재하지 않는 변수이다. 

함수 안 = 지역 변수/ 함수 바깥 = 전역 변수

지역 변수인 $test를 함수 바깥에서 호출해서 정의되지 않은 변수라는 오류가 남
전역변수인 $test가 출력되어서 오류 나지 x

 

함수를 이용하여 문자열 출력

<?php
//함수 정의
function hello(){
 echo "안녕하세요!";
}

//함수 호출
hello();
?>

 

함수 매개변수 이용해서 두 수 합 구하기

<?php
//함수 정의
function plus($a, $b){
 $c = $a +$b;
 echo $c;
}

//함수 호출
plus(10,20);
echo "<br>";
plus(300,500);

?>

 

함수의 반환 값 이용해서 두 수 합 구하기(return)

<?php
//함수 정의
function plus($a, $b){
 $c = $a +$b;
 return $c;
}

//함수 호출
$result1 = plus(10,20);
echo $result1."<br>";

$result2 = plus(300,500);
echo $result2."<br>";


?>

함수의 반환 값 이용해서 정수 합 구하기

<?php
//함수 정의
function plus($a, $b){
 $sum = 0;
  for($i = $a; $i <=$b; $i++)
  {
     $sum +=$i;
  }

 return $sum;
}

//함수 호출
$result1 = plus(1,100);
echo $result1."<br>";


?>

함수의 반환 값 이용해서 만 나이 계산하기

<?php
//함수 정의
function age($year, $month, $day, $b_y, $b_m, $b_d){
//달 기준으로 3개
 if($month >$b_m){
	$age = $year-$b_y;
}
else if($month ==$b_m){
	if($b_d<$day){
	$age = $year-$b_y;
	}
	else{
	$age = $year-$b_y-1;
	}
}
else{
	$age = $year-$b_y-1;
}
return $age;
}

echo age(2023,10,17,2002,11,22);


?>

 

함수를 이용하여 입장료 계산하기

내장 함수

<?php
$tel = "010-2222-1111";
echo "\$tel : $tel <br>";
$num_tel = strlen($tel);
//문자열 길이
echo "$num_tel<br>";

$tel1 = substr($tel,0,3);
echo "$tel1<br>";

$tel2 = substr($tel,4,4);
echo "$tel2<br>";

$tel3 = substr($tel,9,4);
echo "$tel3<br>";

$phone = explode('-',$tel);
echo "$phone[0] $phone[1] $phone[2]"
?>