21.12.21

future_s·2021년 12월 21일
0

php

목록 보기
7/10

낮에 배운 것

전역변수 a를 정의한 상태에서 다음 단계로 함수 안에서 a를 변경한 경우에 밖에서 a를 찍어보면 바뀐 변수값으로 출력된다.

var a = '';

function example() {
  var a = '변수변경'
}
console.log(a);

-> 결과값은 변수변경

나는 이게 결과값이 빈문자열인 줄 알았다. 함수 밖에서 찍으면 함수 안에 있는 것은 적용이 안된다고 생각했기 때문이다. scope 개념을 애매하게 배워서 생긴 문제... 지역변수와 헷갈린듯.. 전역변수는 어디서든 확실히 변경할 수 있기 때문에 전역으로 쓰는 것이다. (깊게 들어간다면 또 조금 다르다고 한다)

학습내용

생활코딩 php 배열의 형식부터
어제하던 공부에 이어서 하는 거라 실습도 이어진다.

▶ 배열의 형식

배열은 반복문과 떼려야 뗄 수 없는 관계다. 같이 공부해야 한다. 배열은 서로 연관된 데이터를 담는 그릇으로써 쓰인다. 수납상자라고 생각하면 된다.

검색어 site:php.net array

<?php
array('a','b','c','d');
?>

이것이 4개의 문자열을 담고 있는 배열의 표현식이다.
이걸 변수에 담아준다.

$coworkers = array('a','b','c','d');

$coworkers는 배열을 담은 변수가 되는 것이다.
수납상자로 생각하라고 했는데 여기까지가 상자에 물건을 담는 방법이고 이제 꺼내는 법을 알아야한다.

b를 꺼내고 싶다면

echo $coworkers[1];

이렇게 써줘야 한다. 물건을 꺼낸 것이다.

그리고 선반 안에 짐이 몇 개가 들어가있나 확인할 필요가 있다. php array total count

count($coworkers);
-> 개수를 알고 싶은 변수에 count를 쓰고
var_dump(count($coworkers));
-> 그걸 var_dump로 데이터타입과 값을 찍는다.
-> int(4)

배열 안에서 여러 작업을 할 수 있는데 그 중에서 한두가지만 알아본다.

php array add value
배열에서 값을 끝에 추가해주는 문법

$coworkers = array('a','b','c','d');
array_push($coworkers,'phpex');
var_dump($coworkers);

결과물이 보기 어렵다면 '페이지 소스 보기'를 눌러보자

array(5) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [4]=>
  string(5) "phpex"
}

이와 같이 뜬다.

만약 배열 끝이 아닌 처음이나 중간에 추가하고 싶을 경우 php array로 검색해서 공홈의 소개 페이지를 살펴보자. 오른쪽의 Array Functions 보기

문제가 생긴다면 그 문제를 해결할 수 있는 걸 검색/질문한다거나 아니면 php공홈처럼 매뉴얼에 있는 이름을 쭉 보면서 추론을 통해 해결하거나 하며 문제를 해결해야한다.


여태껏 배운 내용을 총동원해서 문제를 해결해본다.

일단은 내가 해결하고자 하는 문제를 어떻게 해야 해결할 수 있을까에 대한 조각조각의 생각들을 분명히 할 필요가 있다.

어제 하기로 한 반복문을 이용해서 id값이 바뀔 때마다 제목, 내용이 바뀌어야한다. 페이지를 수동으로 넣는 것이 아니라 자동 처리되게 해야한다.

우선은 강사님이 하는 걸 내가 직접 푼다치고 쭉 봤다.
검색엔진에서 php get file list in directory
(get은 가져온다는 의미)

scandir(string $directory, int $sorting_order = SCANDIR_SORT_ASCENDING, ?resource $context = null): array|false

scandir - 특정 디렉토리에 소속되어 있는 파일 목록을 배열로써 받아낼 수 있다.

매뉴얼에서 정의 부분의 대괄호는 필수는 아니라는 의미

<?php
$list = scandir('./data');
var_dump($list);
?>

이렇게 하면 저번에 li 태그로 불러왔던 각 설명 파일들을 배열로 볼 수 있다.

이제 배열에 담긴 원소들을 더 이상 꺼낼 것이 없을 때까지 하나씩 반복해서 꺼낸다. 꺼낸 걸 이용해 li와 a태그를 이용해 프로그래밍적으로 만들어내면 문제 해결이다.

우선 반복문을 만들기 전에 수동으로 한번 해본다.

<ol>
  <!-- <li><a href="index.php?id=HTML">HTML</a></li> -->
  <?php
  $list = scandir('./data');
  echo "<li>$list[0]</li>\n";
  echo "<li>$list[1]</li>\n";
  echo "<li>$list[2]</li>\n";
  echo "<li>$list[3]</li>\n";
  echo "<li>$list[4]</li>\n";
  echo "<li>$list[5]</li>\n";
  ?>
</ol>


결과는 이렇다. scandir을 쓰면 .과 ..이 생기는데 일단은 없다치고 진행하기. .은 현재 디렉토리 ..은 부모 디렉토리를 의미

그럼 이제 반복문 처리를 한다. 저기에서 반복되는 부분은 다 제어문으로 만들어줄 것이다.

$list = scandir('./data');
$i = 0;
while($i < 6) {
  echo "<li>$list[$i]</li>\n";
  $i = $i + 1;
}

$i < 6으로 정적으로 개수가 설정되어있다. 그러나 이렇게 하면 파일 개수가 늘어나면 대처하기가 어렵다. 동적으로 변경해줘야한다.

php array elements count

$list = scandir('./data');
$i = 0;
while($i < count($list)) {
  echo "<li>$list[$i]</li>\n";
  $i = $i + 1;
}

이렇게 하면 파일 추가나 삭제할 때 동적으로 작동한다.

여기다가 목록 클릭하면 페이지로 이동돼야하니까 a태그 추가해준다. 다만 href에서 ""를 쓸 때 주의점

큰 따옴표가 php에서 문자의 시작과 끝을 나타내는 구분자가 아니라는 걸 php에게 알려줘야한다. (역슬래시)를 쳐주기

<?php
$list = scandir('./data');
$i = 0;
while($i < count($list)) {
  echo "<li><a href=\"index.php?id=$list[$i]\">$list[$i]</a></li>\n";
  $i = $i + 1;
}
?>


페이지 소스 보기를 하면 해당하는 페이지 파일에 맞게 태그가 생성된 것을 볼 수 있다.

이제 저 .과 ..을 없애야 한다.
아주 쉬운 첫번째 방법으론 보통 scandir은 처음, 두번째에 .과 ..을 넣으니까 $i를 2부터 시작하면 된다. 단지 확실한 방법이 아니라 비추다.

근본적으론 반복문 안에서 조건문..
.이 아닐때를 식으로 쓰자면 이렇다.

$list[$i] != '.'

!=와 ==은 반대의 뜻이다.

$list = scandir('./data');
$i = 0;
while($i < count($list)) {
  if($list[$i] != '.'&&$list[$i] != '..') {
    echo "<li><a href=\"index.php?id=$list[$i]\">$list[$i]</a></li>\n";
  }
  $i = $i + 1;
}

결론적으로 이렇게하면 .과 ..이 사라진다.

내가 배운 최소한의 문법을 활용해서 문제를 해결하는 걸 수련해야한다. 세련되지 않은 방법으로 충분히 수련해야한단 말이다. 그게 실력이다.

어려운 내용

  1. 가장 마지막에 if조건문에서 조건을 처음에는 or연산자 ||로 묶었는데 결과에서 계속 점과 점점이 나왔다. 생각해보니 점이 아닌 모든 조건이 모여야 하기 때문에 &&로 고쳤다.

  2. 강의를 끊어서 보니까 한 문제를 갖고 몇날며칠 잡고 있어서 처음 목표를 잊어버리는 것 같다. 오늘 코드를 보니까 약간 낯선 느낌이 있었다.

해결 방법

  1. 원하던 결과가 아닌 결과를 보며 다시 생각해봤다.
  2. 이건 해결책을 좀 찾아봐야할 것 같다. 진도를 단번에 빼든 아님 강의를 듣기 전에 다시 전부 복습을 하든 해야할 것 같다.

느낀 점

변수나 반복문에서 반복횟수 적을때 앞에 $ 적는 걸 자꾸 잊는다.

그리고 짧은 시간이지만 직접 부딪쳐보며 느낀 생각들이 오늘 강의에서 많이 나와서 반가웠다. 현재 내가 많이 부족한 점이 '내가 아는 선에서 문제를 해결하는 능력'이다. 조금만 막혀도 무조건 답을 보고 빨리 익혀야지 하는 생각을 먼저하고 있다.

내일부턴 강의를 덜 나가도 혼자 생각하는 시간을 더 늘려야겠다. 오늘은 건강상태도 너무 안좋아서 특히 더 머리가 안돌아간 것 같다.

profile
미래는 현재의 내가 만들어간다

0개의 댓글