카테고리 없음

개초보 넘어서기 ㅠ (2) - 러닝 PHP

에혀 2020. 2. 3.

쳅터4 : 데이터 집합: 배열다루기 p97 ~ 125

foreach 로 배열 수정하기

$meals = array('Walnut Bun' => 1,
'Cashew Nuts and White Mushrooms' => 4.95,
'Dried Mulberries' => 3.00,
'Eggplant with Chili Sauce' => 6.50);

foreach ($meals as $dish => $price) {
// $price = $price * 2 구문은 효과가 없다.
$meals[$dish] = $meals[$dish] * 2;
}
// 다시 한 번 배열을 순회하며 변경된 값을 출력한다.
foreach ($meals as $dish => $price) {
printf("%s 메뉴의 변경된 가격은 \$%.2f입니다.\n",$dish,$price);
}

배열에서 문자열 생성하기

// implode() 배열에서 문자열 합치기
$dimsum = array('닭고기 번','오리발 구이','순무 케이크');
$menu = implode(', ', $dimsum);
print $menu;
// explode() 배열로 만들기
$fish = '농어, 잉어, 꼬치고기, 가자미';
$fish_list = explode(', ', $fish);
print "두 번째 물고기는 $fish_list[1]입니다.";

 

배열의 정렬

sort() 함수는 원소의 값을 기준으로 배열을 정렬한다. 정렬 후에는 배열의 키가 새로 지정
기 때문에 숫자 키 배열에만 사용할 수 있다

asort() / arsort()

ksort() / krsort()

$meal = array('breakfast' => 'Walnut Bun',
'lunch' => 'Cashew Nuts and White Mushrooms',
'snack' => 'Dried Mulberries',
'dinner' => 'Eggplant with Chili Sauce');
print "정렬 전:\n";
foreach ($meal as $key => $value) {
print " \$meal: $key $value\n";
}
ksort($meal);
print "정렬 후:\n";
foreach ($meal as $key => $value) {
print " \$meal: $key $value\n";
}

다차원 배열

$flavors = array('Japanese' => array('hot' => '와사비',
'salty' => '간장 소스'),
'Chinese' => array('hot' => '머스터드',
'pepper-salty' => '허브잎'));
// $culture는 키, $culture_flavors는 값(배열)이다.
foreach ($flavors as $culture => $culture_flavors) {
// $flavor는 키, $example은 값이다.
foreach ($culture_flavors as $flavor => $example) {
print "$culture $flavor 요리의 재료는 $example 입니다.\n";
}
}

CH6. 데이터와 로직 : 객체 다루기 ( 153~170) :: 객체 부분이 어려운데, 거의 뭐 요점정리다. -_-

그러다가, CH7 웹폼을 제작하다가, 7-6 전부합치기에서 클래스화 하는 것을 보여줌.

class Entree {
public $name;
public $ingredients = array();
public function hasIngredient($ingredient) {
return in_array($ingredient, $this->ingredients);
}
}

// 객체를 생성하고 $soup에 할당
$soup = new Entree;
// $soup 속성 설정
$soup->name = '닭고기 수프';
$soup->ingredients = array('닭고기', '물');
// 또 다른 인스턴스를 생성하고 $sandwich에 할당
$sandwich = new Entree;
// $sandwich 속성 설정
$sandwich->name = '닭고기 샌드위치';
$sandwich->ingredients = array('닭고기 ', '빵');
foreach (['닭고기','레몬','빵','물'] as $ing) {
if ($soup->hasIngredient($ing)) {
print "수프의 재료: $ing.\n";
}
if ($sandwich->hasIngredient($ing)) {
print "샌드위치의 재료: $ing.\n";
}
}

파트3 : 동적 웹사이트 구축 실전

CH7 웹 폼 제작 ( P 173 ~ )

통상적으로 GET은 평범한 웹 페이지를 가져올 때, POST는 폼을 제출할
때 사용한다.
$_SERVER['REQUEST_METHOD']의 값은 <form> 태그의 action 속성 값에 관계없
이 항상 대문자다. 따라서
$_SERVER['REQUEST_METHOD']POST인지 확인하면 폼이 제출됐는
지 혹은 일반적인 페이지 요청인지 구별할 수 있다

 

널 병합 연산자PHP 7에서 도입됐다.

product_id: <?=$_POST['product_id'] ?? ''?>
<br/>
category: <?=$_POST['category'] ?? ''?>

이전 버전을 쓰고 있다면 다음과 같이 isset() 함수를 사용하라.
if (isset($_POST['product_id'])) {
print $_POST['product_id'];
}

기본적인 폼도 출력 코드와 처리 코드를 분리개별 함수로 만들면 한층 유연한 구조로 발전시킬 수 있다.

class FormHelper {
protected $values = array();
public function __construct($values = array()) {
if ($_SERVER['REQUEST_METHOD'] = = 'POST') {
$this->values = $_POST;
} else {
$this->values = $values;
}
}
public function input($type, $attributes = array(), $isMultiple = false) {
$attributes['type'] = $type;
if (($type = = 'radio') || ($type = = 'checkbox')) {
if ($this->isOptionSelected($attributes['name'] ?? null,
$attributes['value'] ?? null)) {
$attributes['checked'] = true;
}
}
return $this->tag('input', $attributes, $isMultiple);
}
public function select($options, $attributes = array()) {
$multiple = $attributes['multiple'] ?? false;
return
$this->start('select', $attributes, $multiple) .
$this->options($attributes['name'] ?? null, $options) .
$this->end('select');
}
public function textarea($attributes = array()) {
$name = $attributes['name'] ?? null;
$value = $this->values[$name] ?? '';
return $this->start('textarea', $attributes) .
htmlentities($value) .
$this->end('textarea');
}
public function tag($tag, $attributes = array(), $isMultiple = false) {
return "<$tag {$this->attributes($attributes, $isMultiple)} />";
}
public function start($tag, $attributes = array(), $isMultiple = false) {
// <select>와 <textarea> 태그는 value 속성이 없다.
$valueAttribute = (! (($tag = = 'select')||($tag = = 'textarea')));
$attrs = $this->attributes($attributes, $isMultiple, $valueAttribute);
return "<$tag $attrs>";
}
public function end($tag) {
return "</$tag>";
}
protected function attributes($attributes, $isMultiple,
$valueAttribute = true) {
$tmp = array();
// 현재 태그에 name과 value 속성이 있고
// $this->values 배열에 name 속성에 해당하는 원소가 있으면
// value 속성을 설정한다.
if ($valueAttribute && isset($attributes['name']) &&
array_key_exists($attributes['name'], $this->values)) {
$attributes['value'] = $this->values[$attributes['name']];
}
foreach ($attributes as $k => $v) {
// $v가 true면 값을 갖지 않는 속성이므로 속성명만 추가한다.
if (is_bool($v)) {
if ($v) { $tmp[] = $this->encode($k); }
}
// 그렇지 않으면 k =v 형태로 추가한다.
else {
$value = $this->encode($v);
// 다중 값을 선택할 수 있는 폼 요소라면
// name에 []를 붙인다.
if ($isMultiple && ($k = = 'name')) {
$value .= '[]';
}
$tmp[] = "$k =\"$value\"";
}
}
return implode(' ', $tmp);
}
protected function options($name, $options) {
$tmp = array();
foreach ($options as $k => $v) {
$s = "<option value =\"{$this->encode($k)}\"";
if ($this->isOptionSelected($name, $k)) {
$s .= ' selected';
}
$s .= ">{$this->encode($v)}</option>";
$tmp[] = $s;
}
return implode('', $tmp);
}
protected function isOptionSelected($name, $value) {
// $this->values 배열에 $name에 해당하는 항목이 없으면
// 이 option 은 선택될 수 없다.
if (! isset($this->values[$name])) {
return false;
}
// $this->values 배열에 $name에 해당하는 항목이 있고
// 그 값이 배열이면, 배열 원소 중에 $value가 있는지 확인한다.
else if (is_array($this->values[$name])) {
return in_array($value, $this->values[$name]);
}
// 그렇지 않으면, $value와 $this->values 배열의 $name 항목을 비교한다.
else {
return $value = = $this->values[$name];
}
}
public function encode($s) {
return htmlentities($s);
}
}

예제 7-31 폼을 생성하는 PHPHTML

 

<?php
// 이 파일과 FormHelper.php 파일은
// 같은 디렉터리에 있어야 한다.
require 'FormHelper.php';
// select 메뉴의 선택 항목 배열 생성
// 이 배열은 display_form(), validate_form(),process_form()에서 사용되므로
// 전역 영역에 선언한다.
$sweets = array('puff' => '참깨 퍼프',
'square' => '코코넛 우유 젤리',
'cake' => '흑설탕 케이크',
'ricemeat' => '찹쌀 경단');
$main_dishes = array('cuke' => '데친 해삼',
'stomach' => '순대',
'tripe' => '와인 소스 양대창',
'taro' => '돼지고기 토란국',
'giblets' => '곱창 소금 구이',
'abalone' => '전복 호박 볶음');
// 메인 페이지 로직
// - 폼이 제출되면, 검증 과정을 거쳐 처리하거나 폼을 다시 출력하고
// - 제출되지 않았으면 폼을 출력한다.
if ($_SERVER['REQUEST_METHOD'] = = 'POST') {
// validate_form()이 오류 메시지를 반환하면 show_form()로 전달
list($errors, $input) = validate_form();
if ($errors) {
show_form($errors);
} else {
// 제출 데이터가 검증을 통과하면 처리한다.
process_form($input);
}
} else {
// 폼이 제출되지 않았으면 폼을 출력한다.
show_form();
}
function show_form($errors = array()) {
$defaults = array('delivery' => 'yes',
'size' => 'medium');
// 기본값을 이용해 $form 객체를 생성한다.
$form = new FormHelper($defaults);
// 폼 출력과 관련된 모든 HTML은 별도의 파일로 완전히 분리한다.
include 'complete-form.php';
}
?> 네. </td></tr>
<tr><td>전달하실 내용이 있으면 메모를 남겨주세요.<br/>
배달 주문이실 경우에는 주소를 남겨주세요.:</td>
<td><?= $form->textarea(['name' => 'comments']) ?></td></tr>
<tr><td colspan ="2" align="center">
<?=$form->input('submit', ['value' => '주문']) ?>
</td></tr>
</table>
</form>

4. 화물 배송 정보를 처리하는 프로그램을 작성하라. 전반적인 배송 정보 입력 폼을 표시하고,
정보를 검증하고 처리해야 한다. 폼 입력 항목은 출발 주소, 배송 주소, 화물의 제원, 무게
등이다. 검증 단계에서는 화물의 무게가
150 파운드 이하인지, 가장 긴 부분의 길이가 36
치 이하인지 검사해야 한다. 폼에 입력된 두 주소는 모두 국내 주소라 가정하고, 우편번호가
형식에 맞는지 확인한다. 폼 처리 함수는 화물 정보를 잘 정돈된 형식에 맞춰 출력한다

 

CH8 정보 저장 : 데이터베이스

댓글