Post

(PHP) 문자열, 배열

문자열

PHP는 기본적으로 문자열을 이루는 각 문자를 ** 1 byte **로 간주한다.

멀티바이트 문자를 다룰 때도 이를 1 byte 단위로 다루기 때문에 오류를 방지하기 위해 mb prefix가 붙은 함수를 사용해야 한다. mb 함수는 기본으로 설치되지 않기 때문에 undefined function Error가 발생할 수 있다. apt-get install php-mbstring해주고 아파치 재시작해주면 된다.

좋은 문법

echoprint보다 아주 약간 빠르다. .으로 잇는 것 보다 그냥 ,으로 출력하는게 더 빠르다.

1
2
3
4
5
echo 'Hello', ' ', 'World';``

// is better than
echo 'Hello' . ' ' . 'World';

단순히 출력해서 확인하려는 목적이면 var\_dump보다 print\_r이 더 낫다. 전자는 저장할 때.

문자열 연결

..=를 사용한다.

1
2
3
4
5
6
<?PHP
$con\_str = "str1" . "str2";
$result .= con\_str . "str3";
print $result;
?>

문자열 내부에 변수 포함시키기

문자열 내부에 $variable이 들어있으면 변수 값이 자동으로 대입된다. ""로 묶어야지만 동작한다. 이를 이용하면 문자열을 결합하거나, 포맷 스트링을 사용하지 않아도 되서 편하다.

1
2
3
$inner\_hello = "[I'M IN!!!]";
$hello = "Hello world from $inner\_hello <br>";

Note ) 배열을 포함할 때는{}로 묶어준다. {$\_GET['user']}

Note ) 문자열 결합보다 속도가 꽤 느리기 때문에, 그냥 문자열 결합을 사용하는게 좋을 때가 있다. $var가 값으로 바인딩되는 것은 직접 ""를 사용했을 경우에만, 변수 선언 시점에 일어나는 것 같다. 그래서 client 측에서 $var를 포함한 문자열을 전송하거나, DB에서 꺼낸 문자열 데이터가 $var를 포함하고 있어도 이를 값으로 바인딩하지 않고 $var라는 문자로 인식한다. <?= $var?>도 마찬가지다.

"”와 ‘‘의 차이

""는 문자열 내부의 개행 문자나 변수를 파싱해 의미론적으로 해석하지만 ''는 파싱하지 않고 그대로 출력한다.

1
2
3
4
5
6
7
8
9
"a\r\nb"    // a b
'a\r\nb'    // a\r\nb

  

$inner = "IN";
"test $inner"     // test IN
'test $inner'     // test $inner

배열

array_*() functions & sort, etc functions

1
2
3
$foo = ['a', 'b', 'c'];
$foo[] = 'd';

배열의 원소를 변수에 한꺼번에 할당하기
1
2
list($var1, $var2, $var3) = $arr;

join ( == implode ) 배열 → 문자열 결합

배열의 원소들을 모두 합쳐 하나의 문자열로 만들 때 반복 돌릴 필요 없이 사용할 수 있다.

1
2
3
4
$arr = ['a', 'b', 'c'];
$joined = join("와 ", $arr);
print $joined;    //a와 b와 c

explode 문자열 → 배열 분할

implode와 반대로 문자열을 구분자를 이용해 배열로 분할하는데 사용한다.

1
2
3
4
5
6
7
8
$exploded = explode("와 ", $joined);    // [a, b, c]
$str\_splited = str\_split($joined);    // [a,
,
,
, , b, ... ]

$preg\_splited = preg\_split('//u', $joined);    // [a, 와, , b, ... ]

explode는 구분 문자에 ""와 같이 빈 문자열을 할당할 수 없다. str\_split은 bytes 단위로 쪼개기 때문에 multi-byte encoded string은 이런식으로 깨져 나오게 된다. UTF-8이기 때문에 3 bytes라서 3개로 쪼개졌다. preg\_split이 bytes 단위가 아니라 multi-byte encoded string을 인식하도록 하려면 반드시 u flag를 주어야 한다. 그리고 정규표현식이라 당연히 위 두 함수보다 속도가 느리다.

연관 배열

:대신 =>를 사용한다.

1
2
3
$associative["key1"] = v1;
$associative2 = ["key1" => v1, "key2" => v2];

extract()

extract()함수는 배열 내부의 ‘키=값’ 쌍을 그대로 변수화 시켜주는 함수다. extract($\_GET);하면 위 예제에서는 ` user=default_value를 선언한 것과 동일한 효과가 있어 $_GET[user]가 아니라 $user`로 접근 가능하다

foreach

배열 순회 시 내부 포인터가 이동한다. foreach는 자동으로 포인터 위치를 초기화하지만, 다른 경우 수동으로 초기화해야 할 수도 있다. reset($arr);

1
2
3
4
foreach($array as $value){
print $value;
}

enumerate 같이 key와 value가 모두 필요한 경우는

1
2
3
4
foreach($arr as $key => $value){
print $key." : ".$value."</br>";
}

This post is licensed under CC BY 4.0 by the author.